4

コンストラクターで静的クラスメンバーがインクリメントされています。ルールに従って、クラス内で宣言され、外部で定義されます。これは完全に合法である必要があります。シンボルの重複エラーが発生する理由はありますか?

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

int Player::numPlayers = 0;
4

2 に答える 2

10

問題は、宣言を定義から分離していないことです。検討:

クラスプレーヤー
{{
   プライベート:
      static int numPlayers;
   公衆:
      Player(){numPlayers ++; }
};

上記のコードは、クラス「Player」に「numPlayers」が存在することを宣言しているだけです。ただし、スペースを予約したり、変数「Player::numPlayers」にメモリアドレスを割り当てたりすることはありません。でも:

int Player :: numPlayers = 0;

上記のコードはDEFINITIONです。これは、オブジェクトPlayer :: numPlayers用のスペースを予約し、そのオブジェクトの一意のアドレスを指定します。その行がプログラムに複数回表示されると、単一定義規則に違反します。今起こっている可能性が最も高いのは、このファイルを含めていることです...

「.c」、「。cpp」、「。m」、「。mm」、またはその他の「ソース」ファイル(つまり、DEFINITIONSを含むファイル)を含めないでください。「ヘッダー」ファイル(つまり、純粋に宣言を含むファイル)のみをインクルードする必要があります。Xcodeを含む多くのビルドシステムでは、各ソースファイルが自動的にコンパイルされてプロジェクトにリンクされます。別のソースファイルからのソースファイルを含めると、定義は2回リンクされます。最初はそれ自体がコンパイルされたとき、次に別のソースファイルによって参照されたときです。

Xcodeについて質問しているので、プロジェクトの詳細ビューでソースファイルのチェックを外すことでこの問題を解決できます。ソースファイルの横にあるチェックマークは、現在のターゲット用にコンパイルおよびリンクインされることを示します。ただし、「。mm」ファイルをチェックしたままにして、宣言を入れる「.h」ファイルを作成し、あるソースファイルを別のソースファイルにインクルードする代わりに「.h」ファイルをインクルードすることを強くお勧めします。

于 2009-12-07T09:09:04.490 に答える
1

複数回定義しましたか?つまり、ヘッダーファイルで定義し、複数のcppファイルにインクルードします。

于 2009-12-07T08:18:07.703 に答える