Инициализация полей класса: вызов функции между прототипом и телом конструктора, как?
{
private:
int a;
char b[10];
public:
myclass():a(0),strcpy(b,"")
{}
};
но возникает ошибка компилятора:
'myclass' : illegal member initialization: 'strcpy' is not a base or member
Что делать:confused:
{
strcpy(b,"");
}
а не проще:
{
b[0] = '\0';
}
?
{
strcpy(b,"");
}
а не проще:
{
b[0] = '\0';
}
?
Вопрос был в том, как это сделать именно между прототипом и телом,
а не в теле!!!!
Так что же делать:confused:
Прототип используется для инициализации полей класса и вызова конструкторов базового типа.
Всё остальное легко и красиво делается в теле. Объективных причин для иного я не вижу. И разработчики языка судя по всему - тоже....
Компилятор английским языком пишет: "'strcpy' - это не имя базового класса и не поле класса..."
а не в теле!!!!
Так что же делать:confused:
Не создавать проблем на пустом месте. Попробуй еще раз перечитать назначение конструкторов и деструкторов класса. C++ - это не игрушка, каждый его инструмент должен иметь свое назначение и не дублировать функциональность предыдущего.
Инициализация до вызова конструктора введена для тех случаев, в которых обеспечивается нормальная работа самого конструктора. Что критичного в том, что твой буфер будет проинициализирован в теле конструктора?
ЗЫ: имхо, в твоем примере, если ты не собираешься писать класс для рутины со строками, то используй string.
Прототип используется для инициализации полей класса и вызова конструкторов базового типа.
Всё остальное легко и красиво делается в теле. Объективных причин для иного я не вижу. И разработчики языка судя по всему - тоже....
Компилятор английским языком пишет: "'strcpy' - это не имя базового класса и не поле класса..."
Вопрос звучал как это сделать, а не есть ли объективные причины делать это.
Кстати инициализировать поля в теле конструктора не рекомендуются.
scorpio если Вы не знаете как это сделать, то это еще не повод чтобы прекратить данную дискуссию.
Посему тема не раскрыта.
компилятор ожидает или конструктор базового класса или переменную-член класса.
Конструктор - не подходит.
А переменная - константный указатель, который изменить нельзя.
Был бы просто char* - вариант присвоить NULL, но тогда под указателем не будет памяти и для работы с ним её надо будет выделить. Такой вариант тоже не подходит.
:D
Извращаться так уж до конца?
{
private:
int a;
char b[10];
public:
myclass() : a( (strcpy(b,""), 0) )
{}
};
Кстати инициализировать поля в теле конструктора не рекомендуются.
От куда такое категоричное мнение?
А для чего тогда вообще конструктор?
Посему тема не раскрыта.
А почему бы все же не использовать std::string ?
а не в теле!!!!
"Прототип" и "тело" - это "объявление" и "реализация"? :)
А то что между ними называется "список инициализации".
компилятор ожидает или конструктор базового класса или переменную-член класса.
Конструктор - не подходит.
А переменная - константный указатель, который изменить нельзя.
Был бы просто char* - вариант присвоить NULL, но тогда под указателем не будет памяти и для работы с ним её надо будет выделить. Такой вариант тоже не подходит.
и на том спасибо.)
Извращаться так уж до конца?
{
private:
int a;
char b[10];
public:
myclass() : a( (strcpy(b,""), 0) )
{}
};
От куда такое категоричное мнение?
А для чего тогда вообще конструктор?
А почему бы все же не использовать std::string ?
"Прототип" и "тело" - это "объявление" и "реализация"? :)
А то что между ними называется "список инициализации".
я и не спорю,
про стд чего-то не подумал, спасибо.!:)
Извращаться так уж до конца?
{
private:
int a;
char b[10];
public:
myclass() : a( (strcpy(b,""), 0) )
{}
};
От куда такое категоричное мнение?
А для чего тогда вообще конструктор?
А почему бы все же не использовать std::string ?
"Прототип" и "тело" - это "объявление" и "реализация"? :)
А то что между ними называется "список инициализации".
Да но например std::string::copy таже ошибка:
'myclass' : illegal member initialization: 'copy' is not a base or member
и на
тоже ругня типа
такого метода не существует.)
'myclass' : illegal member initialization: 'copy' is not a base or member
А зачем тебе std::string::copy?
тоже ругня типа
такого метода не существует.)
Какого "такого"?
А ты соотв. заголовочный файл подключил?
Или же ты пытаешься это использовать применительно к std::string? :)
Какого "такого"?
А ты соотв. заголовочный файл подключил?
Или же ты пытаешься это использовать применительно к std::string? :)
Вопрос звучит четко:
Как инициализировать в списке инициализации конструктора переменную типа a char[10].
Вопрос возникает хотя бы потому, что такая есть возможность для инициализации переменных типа float, int...
Как это сделать правильно?
Как инициализировать в списке инициализации конструктора переменную типа a char[10].
Вопрос возникает хотя бы потому, что такая есть возможность для инициализации переменных типа float, int...
Как это сделать правильно?
Вопрос звучит крайне нечетко!
Как инициализировать в списке инициализации переменную типа char[10] я тебе показал:
Для инициализации переменных типа float, int и т.д. пишешь имя переменной а в скобочках значение:
int i;
myclass() : f(5.f), i(5)
std::string str;
public:
A() : str("") {}
};
Как инициализировать в списке инициализации переменную типа char[10] я тебе показал:
Для инициализации переменных типа float, int и т.д. пишешь имя переменной а в скобочках значение:
int i;
myclass() : f(5.f), i(5)
все задачу решил разобрался...
выкрутился без strcpy.
но если б кто рассказал как использовать фунции типа
::strcpy()
в списке инициализации или хотя бы почему их использовать нельзя был бы благодарен:) !
Единственный способ вызвать функцию в списке инициализации - это инициализировать поле класса либо базовый класс результатом выполнения функции либо метода другого объекта. Примерно так...
{return a+b;}
class TMyClass
{
private:
int FInt;
public:
TMyClass (int x, int y): FInt (Summ (x,y))
{}
};
Единственный способ вызвать функцию в списке инициализации - это инициализировать поле класса либо базовый класс результатом выполнения функции либо метода другого объекта. Примерно так...
{return a+b;}
class TMyClass
{
private:
int FInt;
public:
TMyClass (int x, int y): FInt (Summ (x,y))
{}
};
спасибшо.)
Кстати, не обязательно инициализировать именно результатом: