Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2010, 20:48   #1
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
Печаль Есть код,как правильно перегрузить конструктор

Добрый вечер.Помогите найти ошибку,не могу понять,что именно имеет ввиду компилятор.Ошибки :
1 In file included from main_2_g10.cpp
13 expected `,' or `...' before '&' token
13 ISO C++ forbids declaration of `string' with no type
In function `int main(int, char**)':
10 invalid conversion from `const char*' to `int'
10 initializing argument 1 of `Person::Person(int)'
[Build Error] [Objects/MingW/main_2_g10.o] Error 1


Код:
//noperson.h
#ifndef NO_PERSON_H_
#define NO_PERSON_H_
#include <string>
class Person
{
    private:
        static const int LIMIT = 25;
        std::string lname;//Familia
        char fname[LIMIT];//Imia
    public:
        Person();
        Person(const string & ln,const char * n = "Heyyou");
        Person(const std::string & ln,const char * n);
        ~Person();
        void Show() const;//Imia Familia
        void FormalShow() const;//Familia,Imia
};//end claass Person
#endif
________________________________
//noperson.cpp
#include "noperson.h"
#include <iostream>
Person::Person()
{
    Person::lname = "";
    Person::fname[0] = '\0';
}

Person::Person(const string & ln,const char * n)
{
    Person::lname = ln;
    strncpy(Person::fname,n,Person::LIMIT-1);
    Person::fname[Person::LIMIT-1] = '\0';
}

Person::Person(const string & ln,const char * n)
{
    Person::lname = ln;
    strncpy(Person::fname,n,Person::LIMIT-1);
    Person::fname[Person::LIMIT-1] = '\0';
}

Person::~Person(){}

void Person::Show(void) const
{
    std::cout<<"Imia: "<<fname<<std::endl;
    std::cout<<"Familia: "<<lname<<std::endl;
}

void Person::FormalShow(void) const
{
    std::cout<<"Familia: "<<lname<<std::endl;
    std::cout<<"Imia: "<<fname<<std::endl;
}

_____________________________________
#include "noperson.h"
#include <cstdlib>
#include <iostream>
//using namespace std;
int main(int argc, char *argv[])
{  
    using std::cout;
    using std::endl;
    Person one;
    Person two("Smythecraft");
    Person three("Dimwiddy","Sam");
    one.Show();
    cout<<endl;
    two.Show();
    cout<<endl;
    three.Show();
    cout<<endl;
    one.FormalShow();
    cout<<endl;
    two.FormalShow();
    cout<<endl;
    three.FormalShow();
    system("PAUSE");
    return EXIT_SUCCESS;
}
-ushёl- вне форума Ответить с цитированием
Старый 07.07.2010, 20:59   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
Person(const string & ln,const char * n = "Heyyou");
Person(const std::string & ln,const char * n);
Найдите различие...
p51x вне форума Ответить с цитированием
Старый 07.07.2010, 21:00   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Во-первых, зачем объявляя такой конструктор:
Цитата:
Person(const string & ln,const char * n = "Heyyou");
Вы еще и такой объявляете?
Цитата:
Person(const std::string & ln,const char * n);
Какой по-вашему выбрать компилятору при таком вызове:
Цитата:
Person three("Dimwiddy",'a');
Во-вторых ваш конструктор принимает const string&, const char *, а вы передаете ему константный массив симолов, ссылка на который невозможна по определению, и еще какой-то второй константный массив символов, вместо указателя на char.
Я бы тоже ошибку выдал...
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 07.07.2010, 21:00   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
Person(const std::string & ln,const char * n = "Heyyou");
это раз. а два, конструктор с такой же сигнатурой не может быть перегружен
Код:
Person(const std::string & ln,const char * n);
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 07.07.2010, 21:12   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Syuf
Цитата:
Во-вторых ваш конструктор принимает const string&, const char *, а вы передаете ему константный массив симолов
на самом деле тут все нормально (конкретно в данном коде), т.к std::string имеет конструктор для создания себя из строкового литерала. компилятор не ругается из за наличия слова const. в данном случае просто создается временный объект, а в конструктор передается ссылка на него. но важно помнить, что после выполнения конструктора объект подохнет, и передача ссылки или указателя куда либо еще приведет к проблеме.
пс. если бы слова const не было, то компилятор не смог бы создать временный объект, а ожидал бы созданный объект своего (nт.е string) типа.

вполне легально можно использовать такой код:
const std::string &str = "hello";

но важно понимать, что это представляет собой
const std::string &str = std::string("hello");

т.е инициализатором ссылки является анонимный объект

я уверен, что автор топика этого не знает, но в данном случае ему повезло
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 07.07.2010 в 21:14.
pproger вне форума Ответить с цитированием
Старый 07.07.2010, 21:37   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
на самом деле тут все нормально (конкретно в данном коде), т.к std::string имеет конструктор для создания себя из строкового литерала. компилятор не ругается из за наличия слова const.
А с фундаментальными типами это работает?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 07.07.2010, 21:41   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Syuf
всмысле
const int &i = 5; ?
естественно
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.07.2010, 01:35   #8
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
Смущение

Цитата:
Сообщение от Syuf Посмотреть сообщение
Во-первых, зачем объявляя такой конструктор:

Вы еще и такой объявляете?

Какой по-вашему выбрать компилятору при таком вызове:

Во-вторых ваш конструктор принимает const string&, const char *, а вы передаете ему константный массив симолов, ссылка на который невозможна по определению, и еще какой-то второй константный массив символов, вместо указателя на char.
Я бы тоже ошибку выдал...
Я запутался немного,думал что для каждого объекта нужно создавать отдельный конструктор,тк у меня 3 объекта
-ushёl- вне форума Ответить с цитированием
Старый 08.07.2010, 01:56   #9
-ushёl-
Форумчанин
 
Аватар для -ushёl-
 
Регистрация: 04.02.2009
Сообщений: 141
По умолчанию

Т.е. мне нужно было сделать в main'e примерно следующее,я правильно Вас понял:

const string str = "Smythecraft";//объект стринг получается инициализированным
Person two(str);
const char ArrayStr[25] = "Sam ";
Person three(str,ArrayStr);
И так получается для каждого вновь создаваемого объекта нужно будет создавать константную строку и константный символьный массив?
А если к примеру идёт консольный ввод произвольных имён,как тогда поступать в этом случае,ведь получается что создаются анонимные объекты?
-ushёl- вне форума Ответить с цитированием
Старый 08.07.2010, 10:32   #10
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
const string str = "Smythecraft";//объект стринг получается инициализированным
Person two(str);
Насчет ссылки на string, которой является первый аргумент, меня поправили - действительно, наверное, можно писать так:
Код:
Person two("Smythecraft");
А насчет указателя на char, если вы хотите все инициализировать в конструкторе, вам придется делать так:
Цитата:
const char ArrayStr[25] = "Sam ";
Person three(str,ArrayStr);
Цитата:
А если к примеру идёт консольный ввод произвольных имён,как тогда поступать в этом случае,ведь получается что создаются анонимные объекты?
Можно либо написать функции, принимающие соответственно имя и фамилию и устанавливающие соответствующие данные-члены; либо завести отдельные переменные, в них ввести информацию, а затем уже создавать объект Person.
Цитата:
И так получается для каждого вновь создаваемого объекта нужно будет создавать константную строку и константный символьный массив?
Зачем, можно создать одну строку и один массив, и с ними работать.
Кстати можно поэксперементировать с итераторами входного потока ддля второго аргумента конструктора.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 08.07.2010 в 10:58.
Syuf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть код но почему то не правильно работает -ushёl- Помощь студентам 1 10.05.2010 22:27
Как вам код, и есть ли более простые решения ? SuBwooFer PHP 1 10.09.2009 15:08
Как правильно записать код юникодного символа 0xAD программно для вывода? SkAndrew Общие вопросы Delphi 4 08.11.2008 08:55