Bonjour,
Je souhaiterais créer une classe Toto et pouvoir l'utiliser de cette facon: Toto::moninstance(param).
Je ne sais plus comment s'appele ce mode d'utilisation d'une classe.
Quelqu'un pourrait-il me rafraichir la mémoire?
D'avance merci.
Bonjour,
Je souhaiterais créer une classe Toto et pouvoir l'utiliser de cette facon: Toto::moninstance(param).
Je ne sais plus comment s'appele ce mode d'utilisation d'une classe.
Quelqu'un pourrait-il me rafraichir la mémoire?
D'avance merci.
Tu veux parler d'une méthode statique?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Comme l'a dit Medinoc, c'est une methode static. Cependant il est relativement rare de s'en servir comme ca s'il n'y a pas un but particulier. Par-exemple, on pourrait tres bien tomber sur une classe gerant un personnage :
Apres rien ne t'empeche de creer une classe Wizard et une classe Warrior qui heriteront toutes les deux de Perso. Cependant, les methodes statiques me semblent assez peu adaptees a ce genre de cas. J'ai pour habitude de plutot m'en servir lorsque je ne veux qu'une seule instance d'un objet (on appelle ca un singleton au cas ou ce serait ce que tu cherches). Du coup son constructeur est private et le seul moyen de le creer est de passer par une methode statique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Perso { public: static Wizard create_wizard(); static Warrior create_warrior(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class Object { public: static Object *get_instance() { static Object *o(0); if (!o) { o = new Object; } return o; } private: Object(); }
Alors attention à la version du singleton d'imperio, car elle crée une fuite de mémoire, la manière propre de créer un singleton est comme ceci :
version avec référence :
version avec pointeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class Object { public: static Object & get_instance() { static Object instance; return instance; } private: Object(); }
Les deux versions sont équivalentes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class Object { public: static Object * get_instance() { static Object instance; return &instance; } private: Object(); }
Avec un pointeur effectivement, ça va "fuiter" mais à la fermeture du programme la mémoire va être libérée.
Sans pointeur, l'objet est détruit et la mémoire libérée mais cela se fait à la fin du programme ...
Donc la "fuite de mémoire" on s'en fout un peu dans ce cas là, que l'on alloue dynamiquement ou pas la zone de mémoire est libérée à la fin.
Par contre, si le destructeur doit faire autre chose que libérer des ressources, là ça devient important, et c'est là que la version "sans pointeur" est plus safe et adaptée.
Partager