|
我在编程精粹上看见了一个这样的singleton模式,但是我在使用的时候出了个问题,故和大家请教下,代码入下
#ifndef __SINGLETON_H__
#define __SINGLETON_H__
#include "common.h"
template <typename T>
class CSingleton
{
public:
CSingleton()
{
assert( !m_pSingleton );
int offset = (int)(T*)1 - (int)(CSingleton <T>*)(T*)1;
m_pSingleton = (T*)((int)this + offset);
}
virtual ~CSingleton()
{
Assert( !m_pSingleton, "singleton is NULL POINTOR");
m_pSingleton = 0;
}
void SetObj(T* obj)
{
m_pSingleton = obj;
}
static T* GetObj()
{
return m_pSingleton;
}
private:
static T* m_pSingleton;
};
template <typename T> T* CSingleton <T>::m_pSingleton = 0;
//
class CGameApp:public CSingleton<CGameApp>
{
public:
CGameApp();
virtual ~CGameApp();
virtual bool InitApplication(....);
private:
.......
}
//
#define g_pGameApp CGameApp::GetObj() //为了方便使用
class CGame:public CGameApp
{
public:
CGame();
~virtual CGame();
virtual bool InitApplication(....)
private:
....
}
#endif
//
我在主程序中 那么使用
CGame game;
按照我的理解g_pGameApp应该是指向game中的CGameApp部分,因为只要CGameApp对象建立,那么CSingleton的m_pSingleton就已经自动的指向了它了(CSingleton的构造函数的功能就是这样的,计算offset是害怕在强制转换的时候指针发生偏移),game在创建的时候他自己内部CGameApp部分自动创建(CGame继承了CGameApp),g_pGameApp就指向了game中的CGameApp了,但是我在调试的时候,我的程序告诉我g_pGameApp为NULL,不知道是为什么,请大家帮帮,谢谢了
|
|