Domanda

Ho un membro della classe statica incrementato nel costruttore. Come per le regole, si dichiara nella classe e definito al di fuori. Questo dovrebbe essere totalmente legale. Tutte le idee perché sto ottenendo un errore del simbolo duplicato?

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

int Player::numPlayers = 0;
È stato utile?

Soluzione

Il problema è che non si sta separando la tua dichiarazione tua definizione. Prendere in considerazione:

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

Il codice di cui sopra semplicemente dichiara l'esistenza di "numPlayers" nella classe "Player". Essa non significa, tuttavia, si riserva qualsiasi spazio o assegnare un indirizzo di memoria alla variabile "Player :: numPlayers". Tuttavia:

int Player::numPlayers = 0;

Il codice di cui sopra è una definizione - si riserva di spazio per l'oggetto Player :: numPlayers e designa un indirizzo univoco per quell'oggetto. Avere quella linea appaiono più di una volta in un programma viola l'one-definition-regola. Ora, ciò che è più probabile accadendo è che si sta includendo questo file ...

non si dovrebbe mai, MAI includere un ".c", "cpp", ".m", ".mm" o qualsiasi altro file "sorgente" (vale a dire un file che contiene le definizioni). È necessario includere solo i file "header" (vale a dire file contenenti puramente dichiarazioni). Per molti sistemi di compilazione, inclusi Xcode, ogni file sorgente viene compilato e collegato nel progetto automaticamente. Se si include un file sorgente da un altro file di origine, quindi le definizioni vengono collegati in due volte - prima quando viene compilato da solo e poi di nuovo quando si fa riferimento a un altro file sorgente.

Dal momento che si sta chiedendo informazioni su Xcode ... è possibile risolvere questo problema deselezionando il file sorgente nella finestra del progetto dettagli; un segno di spunta accanto ad un file di origine indica che verrà compilato e collegato-in per il target corrente. Tuttavia, vi consiglio caldamente di lasciare il file ".mm" selezionata, creare un file ".h", in cui si mettono le dichiarazioni, e includere il file ".h" invece di includere un file sorgente da un altro.

Altri suggerimenti

Lo si definiscono più volte? cioè definirlo nel file di intestazione e includere in più file cpp.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top