2013-12-10 4 views
-2

Я пытаюсь создать структуру с использованием SDL 2.0 и O-OP.Singleton class, GraphicsManager и static

Здесь у меня есть 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 namespace!

+0

Где ваша декларация «Графика»? –

+0

Или, более конкретно, вы можете показать нам, как вы объявляете «Графика»? –

+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 предложило мне, чтобы класс наследования должен иметь стандартный конструктор по умолчанию, несмотря на то, что он является Singleton.

Выполняется следующий пример кода. Обратите внимание на изменения, которые я сделал в 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, а не передавать ее на внешний класс родительскому классу. Большинство проблем, похоже, вращаются вокруг видимости метода между родителем и дочерним элементом в иерархии наследования.

+0

Спасибо, Джо Z! –