2011-08-24 55 views
2

我有以下類:「多重定義」錯誤。我究竟做錯了什麼?

class Character 
{ 
public: 
    Character(); 
    Character(std::string char_name, Race char_race, Gender char_gender); 
    ~Character(); 

    int get_id() { return this->char_id; } 
    std::string get_name() { return this->name; } 
    Race get_race() { return this->race; } 
    Gender get_gender() { return this->gender; } 

private: 
    int char_id; 
    static int * char_count; 
    std::string name; 
    Race race; 
    Gender gender; 
}; 
int * Character::char_count = 0; 
#endif // CHARACTER_H 

注意靜電場,這是外部類初始化。

這裏的實現:

Character::Character() 
{ 
    this->char_id = *char_count; 
    char_count++; 
} 

Character::Character(std::string char_name, Race char_race, Gender char_gender) 
{ 
    this->char_id = *char_count; 
    char_count++; 
    this->name = char_name; 
    this->race = char_race; 
    this->gender = char_gender; 
} 

Character::~Character() 
{ 

} 

顯然,我的編譯器不喜歡這個。產生的錯誤是「Character :: char_count的多重定義」,但我沒有看到多重定義。

???

+0

發佈較長版本的錯誤消息。 –

+0

實際代碼中包含的守衛'#ifdef' /'#define'是否真的缺失? – sharptooth

回答

4

靜態場

int * Character::char_count = 0; 

的初始化應該在.cpp文件。否則,會發生以下情況:一旦超過一個.cpp文件獲取包含的.h文件,就會得到靜態字段的兩個定義,並在以後引發鏈接錯誤。包括守衛在這裏沒有幫助 - 它們只能防止將多個包含到同一個.cpp文件中,而不是嵌入到不同的.cpp文件中。

+0

嗯..我試過了,但仍然沒有產生太多。我有同樣的錯誤。任何其他想法? – zeboidlund

+0

@Holland:你是否從.h文件中刪除了初始化程序? – sharptooth

+0

是的,我有。仍然沒有:/ – zeboidlund