2012-03-16 4 views
0
  1. Почему компилятор дает мне ошибку, когда я не инициализирую значение статической переменной-члену? Не следует ли инициализировать значение 0?
  2. Почему я должен инициализировать переменную-член за пределами класса? (это незаконно, потому что если вы это сделаете и измените значение этой статической переменной-члена внутри основной функции, и вы создадите объект этой классы, она будет переназначать статическую переменную матрицы на старое значение), тогда как константный статический член переменная законна быть инициализирована внутри класса (и это возможно, потому что вы не можете изменить значение этой статической переменной-члена в любом случае)?

Ошибка: неопределенная ссылка на CLASS_NAME ::инициализация статических членских переменных C++

+3

Можете ли вы опубликовать код и ошибку компилятора? – hmjd

+0

@hmjd: undefined ссылка на class_name :: a – AlexDan

+1

Примечание: это * linker *, дающий вам ошибку, а не компилятор. Это тот же эффект, что и объявление (свободной) глобальной переменной как «extern» в заголовке, но не определение ее в файле .cpp. Глобальная переменная должна иметь согласованную ячейку памяти, известную всем единицам компиляции, иначе они не будут видеть изменения друг друга в ее значении. Таким образом, он должен иметь внешнюю связь и быть определен точно один раз. Это * не * как переменная 'static' (локальная единица компиляции). – pmdj

ответ

5

От размещена ошибка, линкер о том, что переменная не была определена , не то, что он не был явно инициализирован:

class A 
{ 
    // declaration. 
    static int x; 
}; 

// definition (in this case without explicit initialisation). 
int A::x; 

линкер не должен генерировать ошибку и компилятор не должен выдавать предупреждение, пока не предпринималось никаких попыток использовать переменную static, прежде чем он был выделен Начальное значение.

+0

... вы делали все в порядке, а затем ... В последнем примере кода определения нет. Существует * объявление * и значение инициализации, но нет определения. Во многих случаях это может быть хорошо, поскольку статические интегральные константы имеют специальные правила, но вам все равно нужно ** определить ** константу, если вы * (odr-) используете * it. –

+0

@ DavidRodríguez-dribeas, просто удалил это на данный момент. Я думал при объявлении, если переменной присвоено начальное значение, например, extern int x = 1; ', что это сделало его определением? – hmjd

+0

Huh. 'A :: x' по умолчанию имеет значение' 0', как и любая другая переменная class-static 'int'. –

0

Статический член на самом деле не хранится ни в одном из созданных объектов, поскольку он разделяется между всеми объектами этого класса.

Его следует создавать только один раз, даже если вы создали много объектов этого класса. Или даже если вы создадите no объектов этого класса. Поэтому вы должны делать это отдельно.

Компиляторы предупреждают обо всех видах неинициализированных переменных, а не только о статических. Наличие переменной без значения, как правило, не очень полезно, поэтому эти предупреждения являются хорошими. Добавление = 0 не слишком сложно, не так ли?

Смежные вопросы