|
|
template <typename TClass>
class c_Singleton
{
private:
static TClass *m_pSingleton;
public:
c_Singleton();
virtual ~c_Singleton();
static TClass& GetSingleton();
static TClass* GetSingletonPtr();
};
//initialise pointer
template <typename TClass>
TClass *c_Singleton<TClass>::m_pSingleton = NULL;
//On construction of a derived class, update Singleton pointer to point to new object,
//and assert if there's more than one created
template <typename TClass>
c_Singleton<TClass>::c_Singleton()
{
DebugCriticalAssert( !m_pSingleton );
int offset = (int)(TClass*)(0x1)-(int)(c_Singleton<TClass>*)(TClass*)(0x1);
m_pSingleton = (TClass*)((int)this + offset);
}
template <typename TClass>
c_Singleton<TClass>::~c_Singleton()
{
DebugAssert( m_pSingleton );
m_pSingleton = NULL;
}
template <typename TClass>
TClass &c_Singleton<TClass>::GetSingleton() { return *m_pSingleton; }
template <typename TClass>
TClass *c_Singleton<TClass>::GetSingletonPtr() { return m_pSingleton; }
这里面的构造函数怎么看起来怪怪的。
在使用的时候是这样使用的:
class c_Render : public c_Singleton<c_Render>
{
friend class c_RenderStack;
public:
c_Render();
virtual ~c_Render();
。
。
。
};
我发现如果多声明对象的话,m_pSingleton的指针实际是变化的,后产生的对象指针覆盖前次创建的对象的。
谁看明白这个模板给指点一下。 |
|