2010-05-02 9 views
1

Je suis un programmeur C, mais j'ai appris le C++ @school depuis longtemps. Maintenant j'essaye d'écrire le code en C++ mais obtenant l'erreur de compilateur. S'il vous plaît vérifier et me dire ce qui ne va pas avec mon code.Classe C++ Problème de variable statique - Programmeur C nouveau vers C++

typedef class _filter_session 
{ 
private: 
    static int session_count; /* Number of sessions count -- Static */  
public: 
    _filter_session();   /* Constructor */ 
    ~_filter_session();  /* Destructor */ 
}FILTER_SESSION; 


_filter_session::_filter_session(void) 
{ 
    (this->session_count)++; 
    return; 
} 


_filter_session::~_filter_session(void) 
{ 
    (this->session_count)--; 
    return; 
} 

L'erreur que je reçois est

"erreur LNK2001: symbole externe non résolu "private: statique int _filter_session :: session_count"(? Session_count @ _filter_session @@ 0HA)"

I J'utilise Visual Studio 2005 en passant.

Plz plz aidez-moi.

Cordialement,

MicroKernel

+0

Tout ce que je veux est de garder le nombre de sessions actives ... Comment puis-je le faire? si c'est globalement accessible, n'importe qui en dehors de la classe peut accéder et changer la variable !!! – Microkernel

+6

Les noms globaux commençant par un '_' sont réservés. Vous écrivez du code qui présente un comportement indéfini. –

Répondre

8

static Les variables doivent être définies en dehors du corps de la classe quelque part. La déclaration dans le corps de la classe est juste une déclaration.

E.g. à périmètre global:

int _filter_session::session_count; 

Vous devez vous assurer que cette définition se produit une seule fois dans le programme si généralement vous placerait dans un fichier source (.cc ou .cpp) et non un fichier d'en-tête qui est inclus dans plus de une fois l'unité de traduction.

Pour la portabilité, vous devez éviter les noms de classe commençant par _. Il est également peu besoin de typedef votre nom de classe. class Name { //... introduit un nom de type en C++, vous ne devez pas utiliser class Name pour faire référence au type.

+0

Je pense que cela a été fait exactement sur l'unité de compilation, ou est-ce que je mélange les choses ici. Faire cela dans un en-tête conduirait probablement à des symboles à multiplication définie. –

+0

Oui, il doit satisfaire l'ODR et être défini une seule fois dans le programme, mais comme le constructeur et le destructeur sont également définis 'hors ligne' dans le même bloc de code, je devinais que ce n'était pas un en-tête ou seulement être inclus une fois de toute façon. –

+0

Oui, les fucntions sont dans un fichier C++ séparé. Merci d'avoir souligné, n'y avait pas pensé;) – Microkernel

0

Il suffit d'utiliser session_count++. Une variable statique n'est liée à aucune instance d'une classe et, par conséquent, elle n'est pas accessible via le pointeur this. Toutes les instances de votre classe partagent une instance de session_count. En fait, session_count est accessible même si aucune instance de votre classe n'existe.

Modifier Ok, ma réponse ne résout pas le problème, mais Charles Bailey`s fait.

+0

Tout ce que je veux, c'est de garder le nombre de sessions actives ... Comment puis-je le faire? si c'est globalement accessible, n'importe qui en dehors de la classe peut accéder et changer la variable !!! – Microkernel

+0

@Microkernel: Vous avez manqué le point de Space_C0wb0y. Dans la classe 'session_count' se résout à' _filter_session :: session_count' de toute façon. Parce que c'est une variable statique 'this-> session_count',' _filter_session :: session_count' et 'session_count' se réfèrent tous au même objet. Il n'a pas été suggéré de rendre la variable globale. –

+0

La variable est toujours encapsulée dans la classe. – Puppy

1

ne pas faire avec votre problème, mais en C++ il n'y a pas besoin de typedef classes et structs comme ceci:

typedef class _filter_session 
{ 
    ... 
}FILTER_SESSION; 

Vous pouvez et devez simplement dire:

class filter_session 
{ 
    ... 
}; 

En outre, c Les noms de lass ne devraient normalement pas être en majuscules, car les gens vont les confondre avec les macros. et vous avez rarement besoin d'utiliser la construction this-> - votre code ne l'est certainement pas.

1

Vous devez initialiser la variable statique.Ce code se compile en fait:

typedef class _filter_session 
{ 
private: 
    static int session_count; /* Number of sessions count -- Static */  
public: 
    _filter_session();   /* Constructor */ 
    ~_filter_session();  /* Destructor */ 
}; // FILTER_SESSION; 

int _filter_session::session_count = 0; 


_filter_session::_filter_session(void) 
{ 
    session_count++; 
    return; 
} 


_filter_session::~_filter_session(void) 
{ 
    session_count--; 
    return; 
} 

int main(int argc, const char **argv) 
{ 
    return 0; 
} 

Remarque, je commente FILTER_SESSION compiler sur g ++/Linux, et a également ajouté un principal et a retiré le this-> (comme un autre membre mentionne, la variable est pas une propriété de l'objet Pensez-y comme une variable globale namespaced)

+0

Donc, cette variable statique est accessible par des fonctions non membres. Si oui, comment s'assurer que session_count contient le nombre de sessions actives? Merci pour la réponse :) – Microkernel

+0

Non, il ne sera pas accessible car il est déclaré privé. Le fait que vous puissiez l'initialiser de cette façon ne signifie pas que vous y avez accès en dehors de la classe. – duncan