Консультация № 77961
12.03.2007, 15:04
0.00 руб.
0 4 4
Уважаемые эксперты!
подскажите как инициализировать константный член - указатель на объект
Объявление в приложении.
Такая строка не проходит:
const string_manager *string::__man_def=new string_manager();

Приложение:
class string {...static const string_manager *__man_def;...public:...}

Обсуждение

Неизвестный
12.03.2007, 15:20
общий
это ответ
Здравствуйте, Slin!
Стандарт C++ не предусматривет инициализацию статических членов в объявлении класса.
Следует повторно продублировать объявление этих переменных как глобальных для модуля описания класса, там и инициализировать.
То есть
//в _string.h
class string {
static const string_manager *__man_def;
}
// в _string.cpp
#include "_string.h"
const string_manager *__man_def = new string_manager("gfgdsfgdgffh");

Неизвестный
12.03.2007, 18:05
общий
это ответ
Здравствуйте, Slin!
такие соображения:
во-первых, С++ требует implicit initialization of constants - то есть значения надо давать в момент определения.
во-вторых, С++ полагает internal linkage для констант в отличие от С, который полагает по умолчанию external linkage. Вероятно поэтому ваш пример не работал. Можно попробовать определить extern static const string_manager *__man_def;
Больше идей нет.
Неизвестный
12.03.2007, 18:41
общий
это ответ
Здравствуйте, Slin!
к верному ответу Tek остается только добавить, что инициализацию не обязательно переносить в cpp, достаточно в хидере, просто ниже объявления класса. В самом классе разрешается инициировать только константы простых типов, например int, char, long. Указатель - составной тип, поэтому приходится откладывать его инициализацию. То же самое касается и массивов, они составные.
Неизвестный
12.03.2007, 20:30
общий
это ответ
Здравствуйте, Slin!
Инициируй свой член в конструкторе.
(см.прил-ние)
Удачи!


Приложение:
typedef char string_manager;class string{ const string_manager *__man_def;public: string(){ __man_def=new string_manager[10]; };};
Форма ответа