-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()これらすべてのメソッドも作成したため、継承クラスはそれらを呼び出すことができます。protectedprivate

すべてのメソッドとメンバーをCGraphicsManager非静的にしました。また、些細な実装も行いCGraphicsManager::CGraphicsManager()ましCGraphicsManager::~CGraphicsManager()た。

これは現在コンパイルGraphics.getRenderer()されており、正しいことをしているように見えます。

結局のところ、Singleton<>テンプレート クラスから継承することの価値を疑問視します。staticシングルトンを実装する通常の方法は、これらのメソッドを直接埋め込むか、親クラスに外部委託するのではなく、ローカルを持つフレンド関数を使用することです。ほとんどの問題は、継承階層における親と子の間のメソッドの可視性を中心に展開しているようです。

于 2013-12-10T08:45:29.437 に答える