Frage

Ich habe ein statisches Klassenmitglied im Konstruktor erhöht. Gemäß den Regeln, wird es in der Klasse deklariert und außerhalb definiert. Dies sollte völlig legal. Irgendwelche Ideen, warum ich bin immer einen doppelten Symbolfehler?

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

int Player::numPlayers = 0;
War es hilfreich?

Lösung

Das Problem ist, dass Sie nicht Ihre Erklärung Ihrer Definition sind zu trennen. Bedenken Sie:

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

Der obige Code lediglich erklärt, die Existenz von „numPlayers“ in der Klasse „Player“. Es ist nicht, behält sich jedoch jeden Raum oder eine Speicheradresse der Variablen zuweisen „Player :: numPlayers“. Allerdings:

int Player::numPlayers = 0;

Der obige Code ist eine Definition - es behält sich Raum für das Objekt-Spieler :: numPlayers und bezeichnet eine eindeutige Adresse für das Objekt. diese Zeile mehr als einmal in einem Programm erscheinen Having verletzt die Ein-Definition-Regel. Nun, was höchstwahrscheinlich passiert, ist, dass Sie diese Datei mit ...

Sie sollten sich nicht, sind überhaupt ein „.c“, „CPP“, „.m“, „.mm“ oder andere ‚Quelle‘ Datei (das heißt eine Datei, die Definitionen enthält). Sie sollten nur „Header“ Dateien (das heißt Dateien rein ERKLÄRUNGEN enthält) umfassen. Für viele Build-Systeme, darunter Xcode wird jede Quelldatei automatisch kompiliert und in das Projekt eingebunden. Wenn Sie eine Quelldatei aus einer anderen Quelldatei enthalten, dann erhalten die Definitionen in zweimal verknüpft - erst, wenn es auf seinem eigenen kompiliert und dann wieder, wenn es von einer anderen Quelldatei verwiesen.

Da Sie Xcode fragen ... Sie dieses Problem beheben können im Projektdetailansicht der Quelldatei durch unchecking; ein Häkchen neben einer Quelldatei zeigt an, dass es für das aktuelle Ziel kompiliert und gelinkt-in wird. Allerdings empfehle ich dringend, dass Sie Ihre „.mm“ Datei ausgecheckt lassen, erstellen Sie eine „.h“ Datei, in der Sie Ihre Erklärungen stellen, und auch die „.h“ Datei statt mit einer Quelldatei von einem anderen.

Andere Tipps

Haben Sie definieren mehrere Male? dh definiert es in Header-Datei, und dies in mehreren CPP-Dateien.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top