C++非静态成员引用必须相对于特定对象

C++ nonstatic member reference must be relative to a specific object

本文关键字:相对于 对象 静态成员 引用 C++      更新时间:2023-10-16

首先,我认为查看我的代码会更有意义。标题:

#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,它应该是可访问的,这样就可以向它添加新的GUI项,就像Create中发生的那样(GUI项是其他人继承的基类,例如GUIButton)。

在这种情况下,我使用addItem将项目追加到列表中,但我遇到了关于addItem内的行的a nonstatic member reference must be relative to a specific object错误。我有点困惑为什么会这样。我知道使addItem为静态是导致此错误的原因,但这样做是为了从Create中调用它。有办法绕过这个吗?

对不起,这是一个很糟糕的问题,尽管我已经达到了,但我对C++的理解还不太好。对此有什么想法吗?告诉我最好不要使用Create函数,创建另一个非静态函数来创建我的GUIItems并将它们添加到列表中。

addItem是一个static函数,它不对WindowManager的任何实例进行操作。它无法访问没有实例的非静态m_guilist

也许你只是想要:

Get()->m_guilist.push_back(newGUIItem);

但您正在开始制作接口static,这是一种混合。通常情况下,addItem是非静态的,您使用WindowManager::Get()获取的实例来调用它。

然而,WindowManager并没有不可访问或已删除的构造函数来作为单例类。实现Singleton设计模式的方法。