Justement le " hack" est le point sur lequel il faut faire attention ( et modifier). Ok je la poste ( désolé pour l´indentation) :
/ / Singleton class - original version by Scott Bilas ( Game Programming Gems)
Singleton.h :
template < typename T> class Singleton
{
private:
static T* ms_Singleton;
public:
Singleton()
{
assert(!ms_Singleton);
/ / Non portable
/ / int offset = ( int)(T*)1 - ( int)(Singleton < T>*)(T*)1;
/ / ms_Singleton = ( T*)((int)this + offset);
/ / Correction :
ms_Singleton = static_cast < T*> ( this);
}
~Singleton()
{
assert(ms_Singleton);
ms_Singleton = 0;
}
static T& GetSingleton()
{
assert(ms_Singleton);
return ( *ms_Singleton);
}
static T* GetSingletonPtr() { return ( ms_Singleton); }
};
template < typename T> T* Singleton < T>::ms_Singleton = 0;
Ensuite le new/delete n´est pas obligatoire tu peux t´en servir comme ceci :
Un manager quelconque :
Manager.h
class UnManager : public Singleton<UnManager>
{
. ..
}
- ifdef _STATIC_SINGLETON
#define gManager UnManager::GetSingletonPtr()
- else
extern UnManager *gManager;
- endif
Manager.cpp :
- ifdef _STATIC_SINGLETON
static UnManager gManager;
- endif
L´utilisateur n´a alors pas besoin de se soucier du new/delete dans le cas de la version en statique.