1.通常的實作方式
template <typename T>
class singleton
{
public:
static T& GetInstance()
{
if (!mpSingleton)
mpSingleton = new T();
return *mpSingleton;
}
static void DeInit()
{
if (mpSingleton)
delete mpSingleton;
}
protected:
singleton();
private:
singleton(const singleton&);
singleton& operator=(const singleton&);
private:
static T* mpSingleton;
};
2.在《遊戲程式設計精粹1》上看到的”一種自動的singleton工具“
template <typename T>
class singleton
{
public:
singleton()
{
assert(!mpSingleton);
int offset = (int)(T*)1 - (int)(singleton<T>*)(T*)1;
mpSingleton = (T*)((int)this + offset);
}
~singleton()
{
assert(mpSingleton);
mpSingleton = 0;
}
public:
static T& GetInstance()
{
assert(mpSingleton);
return *mpSingleton;
}
static T* GetInstancePtr()
{
assert(mpSingleton);
return mpSingleton;
}
private:
static T* mpSingleton;
};
template <typename T> T* singleton::mpSingleton = 0;