-2

我正在尝试使用SDL 2.0O-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<'tde::CGraphicsManager'> 中的私有成员

我试图制作 mWindow 和 mRenderer 静态成员,但这种方式不起作用。帮助我在这个系统中以某种方式存储窗口和渲染器,使它们在 tde 命名空间中可见和可用

4

1 回答 1

0

好的,要使这一切正常工作需要阅读一些... 这个Boost 单例页面向我建议继承类需要有一个公共的默认构造函数,尽管它是一个单例。

下面的代码示例编译。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本地的友元函数,而不是将其外包给父类。大多数问题似乎都围绕着继承层次结构中父子节点之间的方法可见性。

于 2013-12-10T08:45:29.437 回答