2013-12-23 2 views
-2

У меня есть следующий код:C++ статический член класса инициализации

class employee { 
public: 
    static int last_id; 
    ... 

}; 

int main() { 
    employee::last_id=0; 
} 

Когда я пытаюсь запустить его он дает следующее сообщение об ошибке:

Undefined symbols for architecture x86_64: 
    "employee::last_id", referenced from: 
     _main in chap7-F3IpS1.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
[Finished in 0.3s with exit code 1] 
+0

Должен иметь googled этот. Я помню, как я столкнулся с этой ошибкой. Когда я googled, первые 10 или около того результатов указывали на переполнение стека. Неудивительно, что я мог бы решить эту проблему без публикации * еще одного дубликата. * –

ответ

3

Вы только заявленную статический элемент данных но не определил его. Запись до основного в глобальном пространстве имен

int employee ::last_id; 

Он будет инициализирован нулем, хотя в явном виде можно указать инициализатор.

+0

Если этот элемент данных должен быть константой, то он может быть инициализирован в определении класса. В этом случае он должен иметь определитель const. –

+0

@ VladfromMoscov: Почти правильно. Однако инициализация некоторого статического 'x' в определении класса не превращает это объявление' x' в определение ... Для обычного 'const' статического определения вне класса все еще требуется, если адрес когда-либо принимается, явно или неявно (рассматривая 'x' как место хранения). Однако с C++ 11 статический 'x' может быть объявлен' constexpr' и инициализирован в определении класса, а затем этого достаточно для любого использования. –

+0

Стоит отметить, что существует специальное исключение из правила Единого определения (или, скорее, это освобождение является частью ODR) для статики в шаблонах классов. А это, в свою очередь, позволяет установить статическую константу любого типа в файл заголовка без использования функции-обертки и ссылки. Я называл это «идиомой», но после ответа на некоторые бесчисленные вопросы, где было бы естественно, стало болезненно ясно, что это абсолютно не идиома, не очень известная, хотя это обычные правила на C++ в игре (в кругообороте мода). ;-) –

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