Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инициализация полей класса: вызов функции между прототипом и телом конструктора, как?

11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Необходимо вызвать существующую функцию ну например strcpy в конструкторе, есть код
Код:
class myclass
{
    private:

            int a;
            char b[10];

    public:
            myclass():a(0),strcpy(b,"")
                                      {}
};


но возникает ошибка компилятора:
'myclass' : illegal member initialization: 'strcpy' is not a base or member

Что делать:confused:
12K
20 августа 2007 года
__AleXX__
133 / / 02.04.2007
 
Код:
myclass():a(0)
{
  strcpy(b,"");
}


а не проще:
 
Код:
myclass():a(0)
{
  b[0] = '\0';
}

?
11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: __AleXX__
 
Код:
myclass():a(0)
{
  strcpy(b,"");
}


а не проще:
 
Код:
myclass():a(0)
{
  b[0] = '\0';
}

?




Вопрос был в том, как это сделать именно между прототипом и телом,
а не в теле!!!!

Так что же делать:confused:

309
20 августа 2007 года
el scorpio
1.1K / / 19.09.2006
Не морочить голову себе и людям.
Прототип используется для инициализации полей класса и вызова конструкторов базового типа.
Всё остальное легко и красиво делается в теле. Объективных причин для иного я не вижу. И разработчики языка судя по всему - тоже....

Цитата:
'myclass' : illegal member initialization: 'strcpy' is not a base or member


Компилятор английским языком пишет: "'strcpy' - это не имя базового класса и не поле класса..."

2.0K
20 августа 2007 года
WidowMaker
212 / / 05.04.2005
Цитата: dafirst
Вопрос был в том, как это сделать именно между прототипом и телом,
а не в теле!!!!
Так что же делать:confused:


Не создавать проблем на пустом месте. Попробуй еще раз перечитать назначение конструкторов и деструкторов класса. C++ - это не игрушка, каждый его инструмент должен иметь свое назначение и не дублировать функциональность предыдущего.
Инициализация до вызова конструктора введена для тех случаев, в которых обеспечивается нормальная работа самого конструктора. Что критичного в том, что твой буфер будет проинициализирован в теле конструктора?

ЗЫ: имхо, в твоем примере, если ты не собираешься писать класс для рутины со строками, то используй string.

12K
20 августа 2007 года
__AleXX__
133 / / 02.04.2007
А нафиг те такой изврат?
11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: el scorpio
Не морочить голову себе и людям.
Прототип используется для инициализации полей класса и вызова конструкторов базового типа.
Всё остальное легко и красиво делается в теле. Объективных причин для иного я не вижу. И разработчики языка судя по всему - тоже....


Компилятор английским языком пишет: "'strcpy' - это не имя базового класса и не поле класса..."



Вопрос звучал как это сделать, а не есть ли объективные причины делать это.

Кстати инициализировать поля в теле конструктора не рекомендуются.

scorpio если Вы не знаете как это сделать, то это еще не повод чтобы прекратить данную дискуссию.

Посему тема не раскрыта.

12K
20 августа 2007 года
__AleXX__
133 / / 02.04.2007
Думаю так сделать в принципе нельзя, т.к.
компилятор ожидает или конструктор базового класса или переменную-член класса.

Конструктор - не подходит.
А переменная - константный указатель, который изменить нельзя.

Был бы просто char* - вариант присвоить NULL, но тогда под указателем не будет памяти и для работы с ним её надо будет выделить. Такой вариант тоже не подходит.
3
20 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: dafirst
Вопрос звучал как это сделать, а не есть ли объективные причины делать это.


:D
Извращаться так уж до конца?

 
Код:
class myclass
{
private:
    int a;
    char b[10];

public:
    myclass() : a( (strcpy(b,""), 0) )
    {}
};


Цитата: dafirst

Кстати инициализировать поля в теле конструктора не рекомендуются.


От куда такое категоричное мнение?
А для чего тогда вообще конструктор?

Цитата: dafirst

Посему тема не раскрыта.


А почему бы все же не использовать std::string ?

Цитата: dafirst
Вопрос был в том, как это сделать именно между прототипом и телом,
а не в теле!!!!


"Прототип" и "тело" - это "объявление" и "реализация"? :)
А то что между ними называется "список инициализации".

11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: __AleXX__
Думаю так сделать в принципе нельзя, т.к.
компилятор ожидает или конструктор базового класса или переменную-член класса.

Конструктор - не подходит.
А переменная - константный указатель, который изменить нельзя.

Был бы просто char* - вариант присвоить NULL, но тогда под указателем не будет памяти и для работы с ним её надо будет выделить. Такой вариант тоже не подходит.




и на том спасибо.)

11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: Green
:D
Извращаться так уж до конца?
 
Код:
class myclass
{
private:
    int a;
    char b[10];

public:
    myclass() : a( (strcpy(b,""), 0) )
    {}
};



От куда такое категоричное мнение?
А для чего тогда вообще конструктор?


А почему бы все же не использовать std::string ?


"Прототип" и "тело" - это "объявление" и "реализация"? :)
А то что между ними называется "список инициализации".



я и не спорю,
про стд чего-то не подумал, спасибо.!:)

11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: Green
:D
Извращаться так уж до конца?
 
Код:
class myclass
{
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() : a( (strcpy(b,""), 0) )

тоже ругня типа
такого метода не существует.)
3
20 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: dafirst
Да но например std::string::copy таже ошибка:
'myclass' : illegal member initialization: 'copy' is not a base or member


А зачем тебе std::string::copy?

Цитата: dafirst
и на
 
Код:
myclass() : a( (strcpy(b,""), 0) )

тоже ругня типа
такого метода не существует.)


Какого "такого"?
А ты соотв. заголовочный файл подключил?
Или же ты пытаешься это использовать применительно к std::string? :)

11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: Green
А зачем тебе std::string::copy?


Какого "такого"?
А ты соотв. заголовочный файл подключил?
Или же ты пытаешься это использовать применительно к std::string? :)



Вопрос звучит четко:
Как инициализировать в списке инициализации конструктора переменную типа a char[10].
Вопрос возникает хотя бы потому, что такая есть возможность для инициализации переменных типа float, int...

Как это сделать правильно?

3
20 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: dafirst
Вопрос звучит четко:
Как инициализировать в списке инициализации конструктора переменную типа a char[10].
Вопрос возникает хотя бы потому, что такая есть возможность для инициализации переменных типа float, int...

Как это сделать правильно?



Вопрос звучит крайне нечетко!

Как инициализировать в списке инициализации переменную типа char[10] я тебе показал:

 
Код:
myclass() : a( (strcpy(b,""), 0) )


Для инициализации переменных типа float, int и т.д. пишешь имя переменной а в скобочках значение:
 
Код:
float f;
int i;
myclass() : f(5.f), i(5)
19K
20 августа 2007 года
Некромант
23 / / 05.12.2006
Почему бы в С++ не использовать стандартные классы типа std::string? Использовать в качестве представления строки char* не рекомедуется.
 
Код:
class A{
std::string str;
public:
A() : str("") {}
};
12K
20 августа 2007 года
__AleXX__
133 / / 02.04.2007
указатель константный, его менять нельзя :) поэтому не подходит
19K
20 августа 2007 года
Некромант
23 / / 05.12.2006
Я это понял и уже исправился)
11K
20 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: Green
Вопрос звучит крайне нечетко!

Как инициализировать в списке инициализации переменную типа char[10] я тебе показал:
 
Код:
myclass() : a( (strcpy(b,""), 0) )


Для инициализации переменных типа float, int и т.д. пишешь имя переменной а в скобочках значение:
 
Код:
float f;
int i;
myclass() : f(5.f), i(5)



все задачу решил разобрался...
выкрутился без strcpy.
но если б кто рассказал как использовать фунции типа
::strcpy()
в списке инициализации или хотя бы почему их использовать нельзя был бы благодарен:) !

309
21 августа 2007 года
el scorpio
1.1K / / 19.09.2006
Я объясню
Единственный способ вызвать функцию в списке инициализации - это инициализировать поле класса либо базовый класс результатом выполнения функции либо метода другого объекта. Примерно так...
Код:
int Summ (int a, int b)
   {return a+b;}

class TMyClass
{
private:
   int FInt;

public:
    TMyClass (int x, int y): FInt (Summ (x,y))
      {}
};
11K
21 августа 2007 года
dafirst
38 / / 05.07.2006
Цитата: el scorpio
Я объясню
Единственный способ вызвать функцию в списке инициализации - это инициализировать поле класса либо базовый класс результатом выполнения функции либо метода другого объекта. Примерно так...
Код:
int Summ (int a, int b)
   {return a+b;}

class TMyClass
{
private:
   int FInt;

public:
    TMyClass (int x, int y): FInt (Summ (x,y))
      {}
};



спасибшо.)

3
21 августа 2007 года
Green
4.8K / / 20.01.2000
М-да... не прошло и 20 постов... А ответ то на первой странице.
Кстати, не обязательно инициализировать именно результатом:
 
Код:
myclass() : a( (strcpy(b,""), 0) )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог