2011-03-04 9 views
5

Tengo una clase que sigue el enfoque singleton, pero, ¿dónde inicializo los miembros de la clase si su constructor es privado?¿Cómo inicializar los miembros de la clase en el patrón de singleton?

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

¿Por qué hay un problema al hacerlo en el constructor? Instance es un miembro de la clase y no debería tener problemas para llamar al constructor. – DumbCoder

Respuesta

12

Puede inicializar los miembros de la clase en el propio constructor como de costumbre, incluso si es privado.

El constructor es privada con el mundo exterior, no a la función miembro estática Instance(). Eso significa que la línea static MyClass singleton en Instance() en realidad invoca el constructor predeterminado, y eso es válido, ya que Instance() tiene acceso a private miembros de la clase.

3

En el constructor, eso es lo que está ahí. Tiene acceso completo a los miembros.

Además, tenga en cuenta que esto no es seguro en una aplicación de subprocesos múltiples.

+0

inseguro depende en gran medida del sistema. –

0

Su método de instancia llama al constructor. El método de Instancia es estático, por lo que puede acceder a él sin que ya esté construido y, dado que es miembro, puede llamar a un constructor privado.

Su constructor puede realizar la inicialización necesaria.

Como un aparte, su miembro singleton debe ser un puntero.

+0

No creo que importe si el miembro es un puntero si es estático dentro de un método. Incluso si es un miembro estático de la clase que debería estar bien (aunque pierdes la posibilidad de una inicialización lenta) a menos que me falta algo. – mkb

+1

Ese estilo particular se llama Singleton de Meyer y se introdujo en "C++ más efectivo" (artículo 26). –

+0

¿Podría ser un puntero de const en lugar de un retorno de referencia? – user963241

Cuestiones relacionadas