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の複数の定義」ですが、複数の定義は表示されません。

???

4

1 に答える 1

4

その静的フィールドの初期化

int * Character::char_count = 0;

.cpp ファイルにある必要があります。そうしないと、次のことが起こります。複数の .cpp ファイルに .h ファイルが含まれていると、静的フィールドの定義が 2 つになり、後でリンク エラーが発生します。インクルード ガードはここでは役に立ちません。異なる .cpp ファイルではなく、同じ .cpp ファイルへの複数のインクルードを防ぐだけです。

于 2011-08-24T05:23:17.263 に答える