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.
P.S. Tout est dans un fichier .cpp. Aucun fichier d'en-tête séparé. –
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. –