2011-03-04 4 views
5

J'ai une approche singleton suivie par une classe, mais où dois-je initialiser les membres de la classe si son constructeur est privé?Comment initialiser des membres de classe dans un modèle singleton?

class MyClass 
{ 
    MyClass() {};    //constructor is private   
    MyClass(const MyClass&);    
    MyClass& operator=(const MyClass&); 
public: 
    static MyClass& Instance() 
    { 
     static MyClass singleton; 
     return singleton; 
    } 
}; 
+1

Pourquoi y a-t-il un problème dans le constructeur? L'instance est un membre de la classe et ne devrait avoir aucun problème appelant le constructeur. – DumbCoder

Répondre

12

Vous pouvez initialiser les membres de classe dans le constructeur lui-même comme d'habitude, même s'il est privé.

Le constructeur est privé au monde extérieur, pas à la fonction de membre statique Instance(). Cela signifie que la ligne static MyClass singleton dans Instance() appelle effectivement constructeur par défaut, et cela est valide, car Instance() a accès aux private membres de la classe!

3

Dans le constructeur, c'est ce qu'il vous faut. Il a un accès complet aux membres.

Notez également que cela est dangereux dans une application multithread.

+0

dangereux dépend fortement du système. –

0

Votre méthode Instance appelle le constructeur. La méthode Instance est statique, donc vous pouvez y accéder sans qu'elle soit déjà construite et comme c'est un membre, elle peut appeler un constructeur privé.

Votre constructeur peut alors effectuer toute initialisation nécessaire. En outre, votre membre singleton devrait être un pointeur.

+0

Je ne pense pas que cela soit important si le membre est un pointeur s'il s'agit d'un static dans une méthode. Même si c'est un membre statique de la classe qui devrait être OK (bien que vous perdiez une chance d'initialisation paresseuse) à moins que je ne manque quelque chose. – mkb

+1

Ce style particulier est appelé singleton de Meyer et il a été introduit dans 'C++ plus efficace' (élément 26). –

+0

Pourrait-il être un pointeur const au lieu d'un retour de référence? – user963241

Questions connexes