J'ai une classe après une approche singleton, mais où puis-je initialiser les membres de la classe si son constructeur est privé?
class MyClass { MyClass() {}; //constructor is private MyClass(const MyClass&); MyClass& operator=(const MyClass&); public: static MyClass& Instance() { static MyClass singleton; return singleton; } };
3 Réponses :
Dans le constructeur, c'est ce que c'est là pour. Il a plein accès aux membres. P>
Aussi, sachez que cela est dangereux dans une application multi-threadée. P>
dangereux dépend fortement du système.
Votre méthode d'instance appelle le constructeur. La méthode d'instance est statique afin que vous puissiez y accéder sans qu'il soit déjà construit et, puisqu'il s'agit d'un membre, il peut appeler un constructeur privé. P>
Votre constructeur peut alors faire une initialisation nécessaire. P>
En écart, votre membre du singleton devrait être un pointeur. P>
Je ne pense pas que cela compte si le membre est un pointeur s'il s'agit d'une statique à l'intérieur d'une méthode. Même si c'est un membre statique de la classe qui devrait être correct (bien que vous perdiez une chance à l'initialisation paresseuse) à moins que je ne manque quelque chose.
Ce style particulier s'appelle le singleton de Meyer et il a été introduit dans "plus efficace C ++" (point 26).
Vous pouvez initialiser les membres de la classe dans le constructeur lui-même comme d'habitude em>, même être privé. p>
Le constructeur est privé em> au monde extérieur, non fort> à la fonction de membre statique instance () code>. Cela signifie, la ligne
statique myclass singleton code> in
instance () code> invoque réellement constructeur par défaut, et qui est valide, comme
instance () code> a accès à
privé code> membres de la classe! p>
Pourquoi y a-t-il un problème, le faire dans le constructeur? L'instance est un membre de la classe et ne devrait pas avoir de problème à appeler le constructeur.