Journal ISO C++ et reference de classe

Posté par  .
Étiquettes : aucune
0
5
juin
2003
Je decouvre une a une les subtilites de l'ISO C++, jusque la rien a dire, ca tourne bien et c'est plutot plus logique que le C++ "bidouille" dont j'avais l'habitude. Mais la crack un pepin que je n'arrive pas a contourner de maniere elegante.

Je suis en train de creer une classe pour laquelle j'ai besoin d'un compteur de reference. Je declare donc un static int que j'incremente dans le constructeur et decremente dans le destructeur (methode classique que j'utilise sans reflechir depuis des annees). Sauf que la crack :
"ISO C++ forbids in-class initialization of non-const static member"

la ligne qui deplait vient du prototype de la classe :

static int compteur = 0 ;

Quelqu'un a une solution (bien sur je pourrais creer une variable exterieure a la classe et l'incrementer a la main lors de la creation de classe mais c'est pas beau)

Aussi vu que c'est interdit, j'imagine que ca doit etre "mal" de faire come ca, si quelqu'un pouvait m'expliquer pourquoi ca serait vraiment sympa.

Kha
  • # Re: ISO C++ et reference de classe

    Posté par  . Évalué à 3.

    Dans la déclaration de la classe, il ne doit pas y avoir d'initialisation (je ne sais pas pourquoi, mais vu qu'il s'agit de *déclaration*, ca semble cohérent) :

    class Truc {
    // ...
    static int compteur;
    };

    L'initialisation se fait hors de la déclaration, en haut de ton fichier d'implémentation par exemple :

    int Truc::compteur = 0;
    • [^] # Re: ISO C++ et reference de classe

      Posté par  (site web personnel) . Évalué à 1.

      Et même si on ne l'initialise pas aussitôt il faut quand même le declarer et mettre juste
      int Truc::compteur;
    • [^] # Re: ISO C++ et reference de classe

      Posté par  . Évalué à 1.

      Merci pour le "en haut" en fait c'etait l'information qui me manquais.
      Il faut declarer les variables statiques en premier (avant tout le reste) sinon le linker ne s'y retrouve plus.

      Merci encore

      Kha
    • [^] # Re: ISO C++ et reference de classe

      Posté par  (site web personnel) . Évalué à 1.

      Ce qui est plutot logique si on reflechit bien.

      primo en C++ on n'initialise jamais dans la declaration,
      il y a le constructeur a cet effet.
      deuxio cette variable va etre une variable de classe donc
      partagée entre plusieurs classes et donc l'initialiser par
      chaque classe serait ... illogique.

      Par contre j'aimerai bien savoir avec quel compilo ce genre
      de code marchait parce que la 1 c un bug et 2 meme gcc-2.95 le refusait ...
  • # Re: ISO C++ et reference de classe

    Posté par  . Évalué à 1.

    Quel compilateur utilises-tu ?
    Je sais qu'avec Visual C++ 6 par exemple ça ne passe pas, mais c'est parce que le compilateur n'est pas ISO-C++ standard justement...
    • [^] # Re: ISO C++ et reference de classe

      Posté par  . Évalué à 2.

      Meme sous windows j'utilise du GNU :). Visual C++ j'ai donne merci, j'aime bien cherche les bugs dans un prog, mais seulement quand c'est les miens, et les bugs compilos ca me fiche hors de moi. Donc sous windows c'est DevCPP (www.bloodshed.net) et rien d'autre (Bon peut etre le compilo Intel de temps en temps, mais alors vraiment rarement).

      Kha
  • # Re: ISO C++ et reference de classe

    Posté par  . Évalué à 1.

    Ayé, j'ai capté ton pb !
    C'est un compteur d'_instances_ que tu veux faire et non un compteur de références.
    • [^] # Re: ISO C++ et reference de classe

      Posté par  . Évalué à 1.

      Oui exact, ma fourche a langue. Je veux faire un systeme de reference qui utilise un compteur d'instance, j'ai fait un joyeux melange de tout ca et au final ca veux plus dire grand chose.

      Desole

      Kha
      • [^] # Re: ISO C++ et reference de classe

        Posté par  . Évalué à 1.

        Tu ne devrais pas oublier non plus de toucher au copy-constructor si tu ne veux pas que ton compteur d'instance commence à délirer.
        Le copy-constructor fourni par le compilo par defaut n'effectue en effet qu'une une copie bit à bit sans modifier ledit compteur.
        Ok, j'arrive un peu tard sur le sujet, et tu es peut-être (probablement?) déjà au courant, m'enfin....

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.