2010-05-11 60 views
3

我想要一個簡單的類,我可以調用,以獲得一個唯一的編號,而程序正在運行 - 我可以做下面的動態分配,然後只是delete需要,但我仍然想要得到一個static版本。 奇怪的是,下面的代碼(這看起來很簡單)會拋出一些奇怪的錯誤(下面附加)。C++在一個類中的靜態int - 編譯時錯誤

任何想法是怎麼回事?這是一個不正確的使用靜態?

class Id_gen { 
    private: 
//adding static here stops the code from compiling: 
static int curr_id; 

    public: 

Id_gen() {curr_id = 1; cout<<"debug:constructed"; } 
int get_id() {curr_id++; return curr_id; }; 
}; 

int main() { 


    Id_gen bGen; 
    cout << bGen.get_id() <<endl; 

return 0;  
} 

運行克++(Linux的64):

c++2.cpp:(.text._ZN6Id_genC1Ev[Id_gen::Id_gen()]+0xe): undefined reference to `Id_gen::curr_id' 
/tmp/cc766N6p.o: In function `Id_gen::get_id()': 
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0xa): undefined reference to `Id_gen::curr_id' 
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0x13): undefined reference to `Id_gen::curr_id' 
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0x19): undefined reference to `Id_gen::curr_id' 
+0

這些是鏈接錯誤,不是編譯錯誤。 – TheJuice 2010-05-11 09:04:30

+1

這些是鏈接器錯誤,而不是編譯時錯誤。這個區別很重要 - 特別是一旦你開始在團隊中工作併爲你的同事創建圖書館。 – 2010-05-11 09:07:00

回答

3

如添加靜態成員的初始化/定義:

int Id_gen::curr_id = 0; 

類定義後。

編輯:正如在評論中提到的@sbi:初始化是可選的,鏈接器只需要定義。

+0

初始化對鏈接器不重要。這是鏈接器需要的__definition__。 – sbi 2010-05-11 08:48:33

2

您需要限定static變量在類的外部爲:

int Id_gen::curr_id; 
0

你必須定義該靜態成員在一個翻譯單元(cpp文件):

int Id_Gen::curr_id = 0; // Initial value 
0

您必須定義在類的實現靜態實例變量,即:

int Id_Gen::curr_id = 0; 
0

正如其他人所說,你需要定義的變量的類之外:

int Id_Gen::curr_id; 

如果沒有別的在這個類,你可以省略構造函數,當你把它定義初始化這個變量,使get_id()函數也是靜態的。這將允許您在不創建類的實例的情況下致電Id_Gen::get_id()。在當前狀態下,如果您錯誤地創建了兩個Id_Gen's,您將重置您的ID。