2009-12-07 4 views
3

J'ai un membre de classe statique incrémenté dans le constructeur. Selon les règles, il est déclaré dans la classe et défini à l'extérieur. Cela devrait être totalement légal. Des idées pour lesquelles je reçois une erreur de symbole en double?C++ Dupliquer Erreur de symbole lors de la définition d'une variable de classe statique dans XCode

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

int Player::numPlayers = 0; 
+0

P.S. Tout est dans un fichier .cpp. Aucun fichier d'en-tête séparé. –

+0

Je ne peux m'empêcher de me demander s'il y a un paramètre de construction, un drapeau ou un paramètre de projet qui tue ceci. Je viens de le tester dans un projet Cocoa vierge et ça marche très bien. Bizarre. –

Répondre

9

Le problème est que vous ne séparez pas votre DÉCLARATION de votre DÉFINITION. Considérez:

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

Le code ci-dessus déclare simplement l'existence de "numPlayers" dans la classe "Player". Il ne réserve cependant pas d'espace ou n'attribue pas d'adresse mémoire à la variable "Player :: numPlayers". Cependant:

 
int Player::numPlayers = 0; 

Le code ci-dessus est une définition - elle se réserve un espace pour l'objet du joueur :: numPlayers et désigne une adresse unique pour cet objet. Le fait que cette ligne apparaisse plus d'une fois dans un programme enfreint la règle de définition unique. Maintenant, ce qui est le plus probable, c'est que vous incluez ce fichier ...

Vous ne devriez JAMAIS inclure un ".c", ".cpp", ".m", ".mm" ou tout autre " fichier source "(c'est-à-dire un fichier contenant DEFINITIONS). Vous ne devez inclure que des fichiers "en-tête" (c'est-à-dire des fichiers contenant uniquement des DÉCLARATIONS). Pour de nombreux systèmes de construction, y compris Xcode, chaque fichier source est automatiquement compilé et lié au projet. Si vous incluez un fichier source provenant d'un autre fichier source, les définitions sont liées deux fois: d'abord lorsqu'il est compilé seul, puis de nouveau lorsqu'il est référencé par un autre fichier source. Puisque vous demandez à propos de Xcode ... vous pouvez remédier à ce problème en décochant le fichier source dans la vue détaillée du projet; une coche à côté d'un fichier source indique qu'il sera compilé et lié à la cible actuelle. Cependant, je vous suggère fortement de laisser votre fichier ".mm" coché, de créer un fichier ".h" dans lequel vous mettez vos déclarations, et d'inclure le fichier ".h" au lieu d'inclure un fichier source d'un autre.

+0

Vous avez parfaitement raison, Michael. La définition et la déclaration doivent être séparées. Le programme était à l'origine un .cpp autonome. Je l'ai ensuite intégré dans une application Cocoa et n'ai eu aucun problème aveC#include du .cpp jusqu'à maintenant. Mais maintenant je sais! Muchimas Gracimus –

1

Avez-vous défini plusieurs fois? ie le définir dans le fichier d'en-tête et l'inclure dans plusieurs fichiers cpp.

+0

Merci, aj. Je ne sais pas si vous avez vu mon "P.S.", mais je n'ai pas de .h pour celui-ci. Cependant, j'ai d'autres fichiers .mm qui peuvent l'inclure. Vérifierai. ÷ D –

+0

oups! c'est dans xcode c'est lui. Mais le concept reste le même je crois. Vérifiez simplement si vous avez inclus plusieurs fois. –

+0

Je viens de vérifier. Un autre fichier d'en-tête pour une classe Objective-C l'inclut, mais je n'ai eu aucun problème pour appeler le code C++ depuis Obj-C. D'autres pensées? –

Questions connexes