2010-07-21 4 views
1

est-il un problème avec la déclaration d'une classe avec un membre statique qui est une autre classe dans un en-tête. Par exemple:classe C++ déclarée en tant que membre de la classe statique

class Stat 
{ 
public: 
    int avar; 
    Stat(); 
}; 

class Test 
{ 
public: 
    static Stat stat; 
}; 

La raison pour laquelle je crains qu'il pourrait causer des problèmes est qu'il semble très similaire à déclarer une variable globale dans un en-tête. S'il est inclus dans deux fichiers cpp, le global est déclaré dans les deux fichiers entraînant une erreur. 'Stat' dans l'exemple ci-dessus doit encore être créé une seule fois entre deux fichiers cpp de la même manière qu'un global alors comment le compilateur peut-il gérer une situation mais pas l'autre ou est la réponse qu'elle ne peut pas?

+1

Ces définitions sont __CLASS, pas declarations__. 'Test :: stat', howver, est juste un declaration__ de __member et a encore besoin d'une définition. (Voir [cette réponse] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632) pour quelles déclarations et définitions C++.) – sbi

Répondre

4

La réponse est que vous Déclarant statique (comme vous pouvez DECLARE un global). Mais vous ne devez définir dans les fichiers cpp.

dans un .h:

extern int myGlobal; 
class A 
{ 
    static int myStaticMember; 
}; 

dans un Cpp:

int myGlobal = 42; 
int A::myStaticMember = 42; 
+0

Je pense que vous vouliez dire 'A :: myStaticMember' – Gianluca

+0

Merci, édité. – Scharron

4

Vous ne déclarez une variable membre de classe statique dans la classe elle-même, vous devez définir séparément dans un fichier cpp:

Stat Test::stat; 

Donc, il n'y a pas d'erreurs du compilateur ou l'éditeur de liens. La déclaration dans votre en-tête fait simplement référence à la définition dans le fichier cpp.

En termes globaux variables, la déclaration est équivalente à:

extern int global; 

Et la définition est équivalente à:

int global; 
Questions connexes