1 votes

Classe C++ Problème de variable statique - Programmeur C débutant en C++

Je suis un programmeur C, mais j'ai appris le C++ à l'école il y a longtemps. Maintenant, j'essaie d'écrire du code en C++ mais j'obtiens une erreur de compilation. Veuillez vérifier et me dire ce qui ne va pas avec mon code.

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 la suivante

"error LNK2001 : unresolved external symbol "private : static int _filter_session::session_count" (?session_count@_filter_session@@0HA)"

J'utilise d'ailleurs Visual Studio 2005.

Plz plz aidez-moi.

Regards,

Micro-noyau

8voto

Charles Bailey Points 244082

static les variables doivent être défini en dehors du corps de la classe, quelque part. Le site déclaration à l'intérieur du corps de la classe est juste une déclaration.

Par exemple, à l'échelle mondiale :

int _filter_session::session_count;

Vous devez veiller à ce que cette définition n'apparaisse qu'une seule fois dans le programme. En général, vous la placez donc dans un fichier source ( .cc ou .cpp ) et non un fichier d'en-tête qui est inclus dans plus d'une unité de traduction.

Pour des raisons de portabilité, vous devriez éviter les noms de classe qui commencent par un caractère _ . Il est également peu nécessaire de typedef le nom de votre classe. class Name { //... introduit un nom de type en C++, vous n'auriez pas à utiliser class Name pour faire référence au type.

1voto

Cela n'a rien à voir avec votre problème, mais en C++, il n'est pas nécessaire de typer les classes et les structures de cette manière :

typedef class _filter_session
{
  ...
}FILTER_SESSION;

Vous pouvez et devriez simplement dire :

class filter_session
{
  ...
};

De plus, les noms de fichiers ne doivent normalement pas être en majuscules, car les gens les confondront avec les macros. et vous avez rarement besoin d'utiliser la fonction this-> votre code ne le fait certainement pas.

1voto

duncan Points 2298

Vous devez initialiser la variable statique. Ce code se compile réellement :

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;
}

Note, j'ai commenté FILTER_SESSION pour compiler sur g++/Linux, et aussi ajouté un main et supprimé le this-> (comme un autre membre le mentionne, la variable n'est pas une propriété de l'objet, mais de la classe. Pensez-y comme une variable globale namespaced)

0voto

Björn Pollex Points 41424

Il suffit d'utiliser session_count++ . Une variable statique n'est liée à aucune instance d'une classe, et on ne peut donc pas y accéder par l'intermédiaire de la fonction this -pointeur. Toutes les instances de votre classe partagent une instance de session_count . En effet, 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X