6
votes

Comment initialiser les membres de la classe dans le modèle Singleton?

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;
    }
};


1 commentaires

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.


3 Réponses :


3
votes

Dans le constructeur, c'est ce que c'est là pour. Il a plein accès aux membres.

Aussi, sachez que cela est dangereux dans une application multi-threadée.


1 commentaires

dangereux dépend fortement du système.



0
votes

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é.

Votre constructeur peut alors faire une initialisation nécessaire.

En écart, votre membre du singleton devrait être un pointeur.


2 commentaires

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).



13
votes

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

Le constructeur est privé au monde extérieur, non à la fonction de membre statique instance () . Cela signifie, la ligne statique myclass singleton in instance () invoque réellement constructeur par défaut, et qui est valide, comme instance () a accès à privé membres de la classe!


0 commentaires