Ошибка «множественного определения». Что я делаю неправильно? - PullRequest
2 голосов
/ 24 августа 2011

У меня следующий класс:

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», но я не вижу множественного определения.

???

1 Ответ

4 голосов
/ 24 августа 2011

Инициализация этого статического поля

int * Character::char_count = 0;

должна быть в файле .cpp.В противном случае происходит следующее: как только несколько файлов .cpp получают включенный файл .h, у вас есть два определения статического поля, и это позже приводит к ошибке ссылки.Защитники включения здесь не помогут - они только предотвращают многократное включение в один и тот же файл .cpp, а не в разные файлы .cpp.

...