me encontré con este trozo de código en "programación de juegos AI por ejemplo":
/* ------------------ MyClass.h -------------------- */
#ifndef MY_SINGLETON
#define MY_SINGLETON
class MyClass
{
private:
// member data
int m_iNum;
//constructor is private
MyClass(){}
//copy ctor and assignment should be private
MyClass(const MyClass &);
MyClass& operator=(const MyClass &);
public:
//strictly speaking, the destructor of a singleton should be private but some
//compilers have problems with this so I've left them as public in all the
//examples in this book
~MyClass();
//methods
int GetVal()const{return m_iNum;}
static MyClass* Instance();
};
#endif
/* -------------------- MyClass.cpp ------------------- */
//this must reside in the cpp file; otherwise, an instance will be created
//for every file in which the header is included
MyClass* MyClass::Instance()
{
static MyClass instance;
return &instance;
}
Estoy confundido por el estado de la materia-de-hecho por el autor que la variable estática declarada dentro de una función en el encabezado resultaría en declarar múltiples variables estáticas separadas instance
. No creo haber visto este comportamiento en mis implementaciones habituales de la función getInstance()
que pongo regularmente en los encabezados (excepto que me gusta jugar con punteros e inicializar el singleton al primer uso). Estoy usando GCC para mi trabajo.
¿Qué dice la norma? ¿Qué dicen los compiladores no conformes? ¿Es correcta la afirmación del autor y, de ser así, puede nombrar algunos compiladores que crearían varias instancias si se declarara getInstance()
en los encabezados?
Una gran discusión sobre cómo implementar un singleton, junto con la seguridad de subprocesos en C++ se puede encontrar en este documento: http://www.aristeia.com/Papers/DDJ%5FJul%5FAug%5F2004%5Frevised .pdf –