Errore di C ++ Duplica simbolo quando si definisce variabile di classe statica in XCode
-
13-09-2019 - |
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;
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.