首先,我认为看到我的代码会更有意义。部首:
#include <vector>
#include "GUIItem.h"
class WindowManager
{
private:
static WindowManager* s_wndmgr; //A singleton maintains a pointer to itself as a class variable
std::vector<GUIItem*> m_guilist; //storage for gui item
//...
public:
static void Create();
static void Destroy();
static inline WindowManager* Get()
{
return s_wndmgr;
}
static void addItem(GUIItem *newGUIItem);
};
上课:
#include "WindowManager.h"
#include "GUIButton.h"
WindowManager* WindowManager::s_wndmgr = NULL;
WindowManager::WindowManager()
{
s_wndmgr = NULL;
}
WindowManager::~WindowManager()
{
//Cleanup other stuff if necessary
delete s_wndmgr;
}
void WindowManager::Create()
{
if ( !s_wndmgr ) s_wndmgr = new WindowManager();
GUIButton *m_btn1 = new GUIButton();
addItem(m_btn1);
}
void WindowManager::Destroy()
{
if ( s_wndmgr ) delete s_wndmgr;
}
void WindowManager::addItem(GUIItem * newGUIItem)
{
m_guilist.push_back(newGUIItem);
}
希望它有某种意义。我试图在OpenGL中从头开始创建一个简单的gui框架,这是一个简单的窗口管理器。我的问题是m_guilist
应该是可访问的,以便可以添加新的GUIItem,例如Create
中发生的(GUIItem是其他人继承的基类,例如GUIButton)。
在这种情况下,我使用addItem
将项目附加到列表中,但我遇到a nonstatic member reference must be relative to a specific object
内有关addItem
内部行的错误。对于为什么会这样,我有点困惑。我知道将addItem
静态化是导致此错误的原因,但这样做是为了从Create
内调用它。有办法解决这个问题吗?
对不起,这是一个非常糟糕的问题,虽然我已经到了那里,但我对C ++的掌握并不是很好。有什么想法吗?有些东西告诉我,我最好单独留下Create
函数并创建另一个非静态函数来创建我的GUIItem并将它们添加到列表中。
答案 0 :(得分:1)
addItem
是一个static
函数,它不会在WindowManager
的任何实例上运行。它无法访问m_guilist
,这是一个非静态的,没有实例。
也许你只想要:
Get()->m_guilist.push_back(newGUIItem);
但是你开始制作界面static
,这是一种混合体。 addItem
通常是非静态的,您可以使用WindowManager::Get()
获取的实例来调用它。
然而,WindowManager
没有不可访问或删除的构造函数来限定单例类。 Ways to implement a Singleton design pattern