【问题标题】:"Multiple Definition Of" Error. What am I doing wrong?“多重定义”错误。我究竟做错了什么?
【发布时间】:2011-08-24 05:20:28
【问题描述】:

我有以下课程:

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 的多重定义”,但我没有看到多重定义。

???

【问题讨论】:

  • 发布更长版本的错误消息。
  • 实际代码中真的缺少包含保护#ifdef/#define吗?

标签: c++ multiple-definition-error


【解决方案1】:

该静态字段的初始化

int * Character::char_count = 0;

应该在 .cpp 文件中。否则会发生以下情况:一旦有多个 .cpp 文件包含 .h 文件,您就有了静态字段的两个定义,这会导致稍后出现链接错误。包含防护在这里没有帮助 - 它们只能防止多次包含到同一个 .cpp 文件中,而不是不同的 .cpp 文件中。

【讨论】:

  • hmm.. 我试过了,但仍然没有产生多少。我有同样的错误。还有其他想法吗?
  • @Holland:你是否从 .h 文件中删除了初始化程序?
  • 是的,我有。还是什么都没有:/
  • 应该.cpp文件中。
  • 确定你真的重新编译了所有文件?如果它只在一个.cpp 之内,它应该可以工作
猜你喜欢
  • 2014-06-15
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多