Original Post
Hi all, I've encountered some problems trying to implement a singleton pattern for a engine i'm developing. In that engine I needed a Renderer object. This renderer object must have subclasses in order to make it API independent. I will have a D3DRenderer and a OGLRenderer subclass for the Renderer class. I need in the engine only one object of the type of one of the two subclasses, but I need to access this object using the generic interface provided by the Renderer class. I thought in doing something like this: --FILE IRenderer.h-- class IRenderer { protected: static IRenderer* m_pRenderer; static void SetRenderer(IRenderer* renderer){m_pRenderer=renderer;} IRenderer(){} public: static IRenderer* GetRenderer(){return m_pRenderer;} virtual ~IRenderer(){} }; IRenderer* IRenderer::m_pRenderer=NULL; --FILE CD3DRenderer.h-- class CD3DRenderer : public IRenderer { private: LPDIRECT3DDEVICE9 m_pD3DDevice; IDirect3D9* m_pD3D9Interface; CD3DRenderer() { m_pD3D9Interface=NULL;m_pD3DDevice=NULL; } long InitD3D(D3DINITDATA* data); public: virtual ~CD3DRenderer(); static void Init(D3DINITDATA* data); }; --FILE CD3DRenderer.cpp-- void CD3DRenderer::Init( D3DINITDATA* data ) { if(m_pRenderer==NULL) { //Construct the new Renderer using the data specified m_pRenderer=new CD3DRenderer(); if(E_FAIL==((CD3DRenderer*)m_pRenderer)->InitD3D(data)) { delete m_pRenderer; m_pRenderer=NULL; } } } long CD3DRenderer::InitD3D( MIRAGED3DINITDATA* data ) { if(NULL==(m_pD3D9Interface=Direct3DCreate9(D3D_SDK_VERSION))) { return E_FAIL; } [...] D3DPRESENT_PARAMETERS d3dpp; [...] if( FAILED( m_pD3D9Interface->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,data->hWnd,vp,&d3dpp, &m_pD3DDevice ) ) ) return E_FAIL; return NOERROR; } CD3DRenderer::~CD3DRenderer() { m_pD3DDevice->Release(); } With this code the logical way to use the renderer object will be this: CD3DRenderer::Init(&somedata); //First initialize the singleton object IRenderer* renderer=IRenderer::GetRenderer(); (Do something with the renderer) The problem is that when I call to IRenderer::GetRenderer() from an application I get always the NULL pointer. I set a breakpoint inside the Init() method and the renderer object is being initialized OK (it is not setting the m_pRenderer varible to NULL). So I think there must be something that I have not took into account. Any ideas?? Thanks beforehand.