2013-12-10 78 views
-2

我正在嘗試使用SDL 2.0O-OPSingleton類,GraphicsManager和靜態

在這裏,我有一個CGraphicsManager類:

namespace tde { 
    class CGraphicsManager : public Singleton<CGraphicsManager> 
    { 
    private: 
     static SDL_Window* mWindow; 
     static SDL_Renderer* mRenderer; 

    public: 
     ~CGraphicsManager(); 

     static Uint32 Init(const char* title, Vector2i& size, Uint32 flags); 
     static SDL_Window* getWindow(){ return mWindow; } 
     static SDL_Renderer* getRenderer() { return mRenderer; } 
    }; 
} 

,當我嘗試這樣做:

SDL_RenderClear(Graphics.getRenderer()); 

編譯器說:

錯誤C2248:辛格爾頓::辛格爾頓無法訪問Singleton中的私人成員<'tde :: CGraphicsManager'>

我試圖讓mWindow和mRenderer靜態成員,但這種方式不起作用。幫助我在此係統中以某種方式存儲窗口和渲染器,以使它們可見並可在tde命名空間中使用!

+0

你的'Graphics'聲明在哪裏? –

+0

或者更具體地說,你能告訴我們你是如何聲明'Graphics'的嗎? –

+0

「#define Graphics tde :: CGraphicsManager :: getInstance()」 它位於全局命名空間的「Root.h」中。定義適合CRoot類的作品。 這裏是完成Root.h的鏈接:https://www.dropbox.com/s/ox2hvhqwo28jhfd/Singleton_SDL_static__Root.h.txt –

回答

0

好吧,爲了讓所有的工作都需要一點點的閱讀......這Boost singleton page建議我說繼承類需要有一個公共的默認構造函數,儘管它是一個單例。

下面的代碼示例編譯。注意我對SingletonCGraphicsManager所做的更改:

template<typename T> 
class Singleton 
{ 
    protected: 
    Singleton() { }; 
    Singleton(const T&); 
    Singleton& operator=(const T&); 

    public: 

    static T& getInstance() { 
     static T instance; 
     return instance; 
    } 

    ~Singleton() { }; 
}; 

namespace tde 
{ 
    class CGraphicsManager : public Singleton<CGraphicsManager> 
    { 
    private: 
     SDL_Window* mWindow; 
     SDL_Renderer* mRenderer; 

    public: 
     CGraphicsManager() { } 
     ~CGraphicsManager() { }; 

     unsigned Init(const char* title, unsigned& size, unsigned flags); 
     SDL_Window* getWindow(){ return mWindow; } 
     SDL_Renderer* getRenderer() { return mRenderer; } 
    }; 
} 

我給Singleton::Singleton()Singleton::~Singleton()瑣碎的實現。我也做了所有這些方法protected而不是private,所以繼承類可以調用它們。

我做了所有的方法和成員CGraphicsManager非靜態。而且,我還給出了CGraphicsManager::CGraphicsManager()CGraphicsManager::~CGraphicsManager()微不足道的實現。

這個編譯現在,Graphics.getRenderer()似乎做正確的事情。

畢竟,我質疑從Singleton<>模板類繼承的價值。我實現一個Singleton的通常方式是直接嵌入這些方法,或者使用一個具有局部地址的朋友函數,而不是將其外包給父類。大多數問題似乎都圍繞繼承層次結構中的父級和子級之間的方法可見性。

+0

謝謝你,喬Z! –