Cheers,Singletons tramite istanza statica in C++ - in origine o in file di intestazione?
mi sono imbattuto in questo pezzo di codice in "Programmazione Gioco AI by Example":
/* ------------------ 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;
}
Sono confuso dalla dichiarazione dato di fatto da parte dell'autore che la variabile dichiarata staticamente all'interno di una funzione nell'intestazione risulterebbe la dichiarazione di più variabili statiche separate instance
. Non penso di aver visto questo comportamento nelle mie abituali implementazioni della funzione getInstance()
che inserisco regolarmente nelle intestazioni (ad eccezione del fatto che mi piace giocare con i puntatori e inizializzare il singleton al primo utilizzo). Sto usando GCC per il mio lavoro.
Quindi cosa dice lo standard? Cosa dicono i compilatori non conformi? La dichiarazione dell'autore è corretta e, in caso affermativo, puoi nominare alcuni compilatori che creerebbero più istanze se getInstance()
fosse dichiarato nelle intestazioni?
Una grande discussione su come realizzare un singoletto, insieme con filo di sicurezza in C++ possono essere trovate in questo documento: http://www.aristeia.com/Papers/DDJ%5FJul%5FAug%5F2004%5Frevised .pdf –