2010-04-25 7 views
2

J'essaie de créer une classe qui contient un pointeur statique vers une instance de lui-même. Voici un exemple:Variables membres statiques de la même classe en C++

Ah:

#include <iostream> 

#ifndef _A_H 
#define _A_H 

class A { 
static A * a; 
}; 

A * a = NULL; 

#endif 

Cependant, quand j'inclure Ah dans un autre fichier, par exemple:

#include "A.h" 

class B { 

}; 

Je reçois l'erreur suivante:

ld: duplicate symbol _a in /Users/helixed/Desktop/Example/build/Example.build/Debug/Example.build/Objects-normal/x86_64/B.o and /Users/helixed/Desktop/Example/build/Example.build/Debug/Examplebuild/Objects-normal/x86_64/A.o 

J'utilise le compilateur par défaut de Xcode sur Mac OS X Snow Leopard.

Répondre

5

Cette ligne:

A * a = NULL; 

doit ressembler à ceci:

A *A::a = NULL; 

Et vous devez le déplacer hors du fichier d'en-tête, et le mettre dans un fichier source (.cpp) .

La définition d'un membre statique ne doit exister qu'une seule fois dans votre programme. Si vous placez cette ligne dans le fichier d'en-tête, elle sera incluse dans chaque fichier source qui l'inclut, ce qui entraînera une erreur de symbole en double.

+0

sens. Merci. – LandonSchropp

2

Parce que la variable globale a est définie dans les deux A.cpp et B.cpp. Un symbole public doit seulement être défini au même endroit. Le reste peut savoir ce que le contenu de ce symbole en liant.

Déplacez la ligne A* a = NULL de A.h vers A.cpp.

(BTW, se référer à la a dans la classe A, utilisez A* A::a = NULL;, sinon vous créez un a dans l'espace de noms global.)

+0

D'accord, je comprends. Merci. – LandonSchropp