2010-05-11 6 views
3

Je veux avoir une classe simple que je peux appeler pour obtenir un numéro unique pendant que le programme est en cours d'exécution - je peux faire ci-dessous avec une allocation dynamique, puis delete sinon nécessaire, mais je voulais toujours obtenir une version static aussi. Etrangement, le code ci-dessous (qui est apparemment simple) jette quelques étranges erreurs de comiple (ci-dessous).C++ statique int dans une classe - erreur de compilation

Des idées quoi de neuf? est-ce une utilisation incorrecte de statique?

class Id_gen { 
    private: 
//adding static here stops the code from compiling: 
static int curr_id; 

    public: 

Id_gen() {curr_id = 1; cout<<"debug:constructed"; } 
int get_id() {curr_id++; return curr_id; }; 
}; 

int main() { 


    Id_gen bGen; 
    cout << bGen.get_id() <<endl; 

return 0;  
} 

en cours d'exécution g ++ (Linux 64):

c++2.cpp:(.text._ZN6Id_genC1Ev[Id_gen::Id_gen()]+0xe): undefined reference to `Id_gen::curr_id' 
/tmp/cc766N6p.o: In function `Id_gen::get_id()': 
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0xa): undefined reference to `Id_gen::curr_id' 
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0x13): undefined reference to `Id_gen::curr_id' 
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0x19): undefined reference to `Id_gen::curr_id' 
+0

Ce sont des erreurs de liaison, pas des erreurs de compilation. – TheJuice

+1

Ce sont des erreurs de liens, pas des erreurs de compilation. La distinction compte - en particulier lorsque vous commencez à travailler en équipe et que vous créez des bibliothèques pour vos collègues. –

Répondre

3

Ajouter l'initialisation/définition de l'organe statique:

int Id_gen::curr_id = 0; 

après la définition de la classe.

EDIT: Comme mentionné dans le commentaire de @sbi: L'initialisation est facultative, l'éditeur de liens ne requiert que la définition.

+0

L'initialisation n'est pas importante pour l'éditeur de liens. C'est la __definition__ dont le linker a besoin. – sbi

2

Vous devez définir la variable static en dehors de la classe:

int Id_gen::curr_id; 
0

Vous devez définir le membre statique une unité de traduction (fichier cpp):

int Id_Gen::curr_id = 0; // Initial value 
0

Vous devez définir la variable d'instance statique dans l'implémentation de la classe, i.e. .:

int Id_Gen::curr_id = 0; 
0

Comme mentionné par d'autres, vous devez définir la variable en dehors de la classe:

int Id_Gen::curr_id; 

S'il n'y a rien d'autre dans cette classe, vous pouvez omettre le constructeur et initialiser cette variable lorsque vous définissez et faire la get_id() fonction statique aussi. Cela vous permet d'appeler le Id_Gen::get_id() sans créer d'instance de la classe. Dans son état actuel si vous avez créé par erreur deux Id_Gen, vous devez réinitialiser votre identifiant.

Questions connexes