我正在尝试使用 SDL 2.0 和 O-OP 制作框架。
这里我有一个 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 :: Singleton无法访问Singleton中的私有成员&lt;'tde :: CGraphicsManager'&gt;
我试图让mWindow和mRenderer成为静态成员,但这种方式不起作用。帮助我在这个系统中以某种方式存储窗口和渲染器,使它们在 tde 命名空间中可见和可用!
答案 0 :(得分:0)
好的,要使所有工作都需要一些阅读......这个Boost singleton page向我建议继承类需要有一个公共默认构造函数,尽管它是一个单例。
以下代码示例进行编译。请注意我对Singleton
和CGraphicsManager
所做的更改:
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的通常方法是直接嵌入这些方法,或者使用具有static
本地的友元函数,而不是将其外包给父类。大多数问题似乎都围绕继承层次结构中父级和子级之间的方法可见性。