2011-08-24 54 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