30

Ca répond pas à la question. Une variable locale c'est un moyen, pas un but. wink

31

Ben un cache, c'est pas un attribut. Enfin je ne trouve pas.
Genre dans le diagramme de classe tu ne fais pas apparaître les caches.
Je n'ai pas envie de polluer ma liste d'attributs, c'est tout.

32

Tu peux le formuler comme tu veux, ton cache est propre à l'instance de la classe, donc c'en est bien un attribut smile

33

Désolé pour réponse tardive (j'aime bien fouiller dans les vieux sujets ^^), mais je propose une explication, provenant de mes quelques connaissances du fonctionnement du C++ au niveau machine.

Alors pour commencer, une classe c'est :
- un fichier en-tête, définissant l'ensemble des attributs et des membres d'une classe (avec visibilité). Le header doit être suffisant au compilo pour connaître la taille d'une instance de la classe !
- un fichier de corps, contenant la définition de l'ensemble des méthodes de la classe. Le fichier se doit de définir l'ensemble des méthodes de la classe. Si l'une d'entre elle n'est pas définie, c'est le crash au link si quelqu'un tente de l'appeler.

Jusque là, tout va bien.

Maintenant, regardons l'implémentation de la classe et de ses instances dans le code exécutable.
- À la compilation du source contenant les définitions de méthodes, le code de chacune d'entre elle est compilé, et n'existe et n'existera qu'une et une seule fois dans le code exécutable.
- À l'instanciation de la classe, l'espace requis pour l'ensemble des attributs (<= espace doit être connu simplement grâce au header) est alloué (sur le tas, ou dynamique selon la méthode d'instanciation), et pas un octet de plus !

Le fonctionnement de l'appel des méthodes de la classe (hors statique, bien entendu), est assez spécifique car il utilise une convention d'appel qui s'intitule "thiscall". Elle est donc différente du cdecl, du fastcall ou du stdcall (au autre si autre il existe). Cette méthode envoie le this de l'instance de la classe à laquelle doit s'appliquer la méthode. En fait, appeler une méthode de classe se rapporte exactement à l'appel en C d'une fonction devant travailler sur une structure dont on donne le pointeur à la fonction, à ceci près qu'on ne se soucie pas ici de passer le pointeur vers l'instance de la classe, le compilo le fait pour nous. Les méthodes sont donc compilées en prenant un paramètre supplémentaire sans que l'on s'en rende compte, c'est totalement transparent pour l'utilisateur.

Passons maintenant au mot clef static, ce qui nous intéresse ici :
- Le mot clef est présent devant une variable attribut de la classe (dans le header). Dans ce cas, il s'agit d'une variable statique et commune à toutes les instances de la classe qui sera placée dans l'endroit prévu pour, et initialisée lors de la première instanciation de la classe.
- Le mot clef est présent devant une méthode de la classe (dans le header). Dans ce cas, la méthode ne nécessite pas d'instance spécifique à la classe, et la convention d'appel n'est pas thiscall. Elle a quand même un accès privilégié aux attributs des instances de la classe qu'elle peut manipuler (Au passage, je me demande si quelqu'un peut nous éclairer sur la différence entre une méthode statique et une méthode externe déclarée amie de la classe, ça m'intéresse).
- Enfin, et c'est là qu'on en vient, le mot clef est devant une variable locale d'une méthode non statique de la classe (pour une méthode statique, la variable locale est statique à la méthode mais n'appartient à aucune instance de la classe). Dans ce cas comme vu plus haut, il existera une seule instance de cette variable, commune à toutes les instances de la classe, qui sera initialisée au premier appel de la fonction membre associée. Pourquoi?

Eh bien car il n'existe qu'une instance du code de la méthode dans l'exécutable, et que donc il ne peut exister qu'une seule variable statique associée à cette fonction. En effet la variable statique est déclarée dans le fichier code de définition des fonctions, et non dans le header. Le compilateur ne peut pas la considérer comme faisant partie de chaque instance de la classe, car cette déclaration étant faite en dehors du header, elle n'est pas prise en compte pour calculer la taille d'une instance de la classe. Et il n'existe aucun autre moyen de dire au compilateur d'allouer plus d'espace que nécessaire que de déclarer la variable en attribut et donc de l'initialiser au constructeur. Voilà donc selon moi le pourquoi du comment.

La meilleure solution reste donc l'utilisation d'un attribut supplémentaire et la règlementation sur son utilisation (comme tout attribut en fait ^^), et son initialisation dans le/les constructeur(s).

À priori je ne vois pas de cas de figure où le constructeur ne pourrait pas initialiser la variable^^

Bonne continuation à tous, j'espère que j'étais clair et que je me suis pas trompé dans mes explications (je sors tout fraîchement de mes études, donc mes connaissances ne sont pas encore totalement stables ^^)