2013-12-23 164 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

應該用google搜索這個。我記得遇到這個錯誤。當我GOOGLE了它,前10個左右的結果指向堆棧溢出。難怪我可以解決這個問題,而不會發布*另一個副本。* – 2013-12-23 19:44:18

回答

3
int employee::last_id=0; 
int main() { 
    [...] 

} 
3

你只是聲明瞭靜態數據成員但沒有定義它。在全局命名空間的主要之前寫入

int employee ::last_id; 

儘管您明確指定了初始化程序,但它將被初始化爲0。

+0

如果這個數據成員應該是一個常量,那麼它可以在類定義中初始化。在這種情況下,它必須具有限定符const。 –

+0

@ VladfromMoscov:幾乎正確。然而,類定義中的一些靜態'x'的初始化並不會將'x'的聲明轉換爲定義...對於普通的'const'靜態,如果地址被明確或隱含地採用(將'x'視爲存儲位置)。但是,使用C++ 11時,靜態'x'可以聲明爲'constexpr',並在類定義中初始化,然後足夠用於任何用法。 –

+0

值得注意的是,對於類模板中的統計信息,One Definition Rule有一個特殊的豁免(或者說,這種豁免是ODR的一部分)。這反過來又允許在頭文件中定義任何類型的靜態常量,而不使用包裝函數和引用。我曾經稱這是一個「成語」,但在回答了一些很自然的問題後,它變得痛苦地清楚,它絕對不是一個成語,儘管它只是普通的C++規則(在一個環形交叉路口時尚)。 ;-) –