Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Инициализация костанты в классе


Автор: Royan 8.10.2004, 13:08
Судя по теперешнему хелпу (MSDN'у) в VC++.NET я могу написать следующее:

Код
class A(){
 static const int k = 1;//инициализация статической интегральной константы
public:
 A(){}
};


Придя в институт, где стоит VC++6 обнаружилось, что этакого делать нельзя. Т.е. константы надо инициализировать классическим способом А() : k(1){}, при этом "k" не должно быть статическим членом.

Собственно, а как правильно с точки зрения стандарта. И выходит что это баг в VC++6?

Автор: Step 8.10.2004, 13:11
действительно есть такая проблемка..... и я желаю получить на нее ответ

Автор: DENNN 8.10.2004, 13:17
Стандарт на эту тему я не знаю, но, судя по многочисленной литературе с примерами кода,
класический подход
Код

class A (value1, value2) : k1(value1), k2( value2)
{
.......
}

где k1, k2 - члены класса, для которых не определен конструктор по умолчанию
value1, value2 - параметры или иные данные
верен, а значит должен быть и верен частный случай, где в членах класса есть переменная константа встроенного типа.

Автор: Vyacheslav 8.10.2004, 13:17
По стандарту объявление статических полей в классе является всего лишь ее декларированием и только. Необходимо выполнить еще и "реализацию", то ее нужно еще и определить
Код

class A(){
static const int k;
public:
A(){}
};

const int A::k = 10;
//можно и просто
//const int A::k;

В последнем случае k будет инициализирован нулем

Автор: Vyacheslav 8.10.2004, 14:39
Хотя виноват. Действительно в стандарте только для статических констант( на статические члены-неконстанты это не распространяется) разрешена инициаализация в классе.
VC++6 в данном случае нарушает стандарт.
С++Builder 6 эту возможность поддерживает

Автор: srd 8.10.2004, 15:03
Вроде инициализация статических членов-констант в классе разрешена только для интегральных типов.

Автор: Улисс 8.10.2004, 21:25
А я всю жизнь пользуюсь вариантом таким:

class A {
enum { k=10 };
};

работает пока везде...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)