2008-10-12 7 views
99

mis très simplement:symbole externe non résolu sur les membres de la classe statique

J'ai une classe qui se compose essentiellement de membres du public statiques, donc je peux les fonctions similaires de groupe ensemble qui doivent encore être appelés à partir d'autres classes/fonctions. Quoi qu'il en soit, j'ai défini deux variables char char non signées dans ma portée publique de classe, quand j'essaye de modifier ces valeurs dans le constructeur de la même classe, j'obtiens une erreur de "symbole externe non résolu" à la compilation.

class test { 

    public: 

     static unsigned char X; 
     static unsigned char Y; 

     ... 

     test(); 
}; 

test::test() { 
    X = 1; 
    Y = 2; 
} 

Je suis nouveau en C++ alors allez-y doucement. Pourquoi je ne peux pas faire ça?

Répondre

112

Vous avez oublié d'ajouter les définitions en fonction de vos déclarations de X et Y

unsigned char test::X; 
unsigned char test::Y; 

quelque part. Vous pouvez initialiser également membre statique

unsigned char test::X = 4; 

et encore, vous le faites dans la définition (généralement dans un fichier CXX) pas dans la déclaration (qui est souvent dans un fichier .H)

+1

Si vous écrivez bibliothèque d'en-tête uniquement, vous pouvez utiliser cette technique pour éviter cpp: http://stackoverflow.com/questions/11709859/how-to-have-static -data-membres-dans-une-seule-bibliothèque-en-tête – ShitalShah

54

Les déclarations de membres de données statiques dans la déclaration de classe ne sont pas une définition de celles-ci. Pour les définir, vous devez le faire dans le fichier .CPP pour éviter les symboles dupliqués.

Les seules données que vous pouvez déclarer et définir sont les constantes statiques intégrées. (Les valeurs de enums peuvent être utilisés comme valeurs constantes ainsi)

Vous pouvez réécrire votre code comme:

class test { 
public: 
    const static unsigned char X = 1; 
    const static unsigned char Y = 2; 
    ... 
    test(); 
}; 

test::test() { 
} 

Si vous voulez avoir la capacité de vous modifier des variables statiques (en d'autres termes lorsque il est inapproprié de les déclarer comme const), vous pouvez vous séparer le code entre .H et .CPP de la manière suivante:

.H:

class test { 
public: 

    static unsigned char X; 
    static unsigned char Y; 

    ... 

    test(); 
}; 

.CPP:

unsigned char test::X = 1; 
unsigned char test::Y = 2; 

test::test() 
{ 
    // constructor is empty. 
    // We don't initialize static data member here, 
    // because static data initialization will happen on every constructor call. 
} 
Questions connexes