我正在为我拥有的所有GUI对象创建一个Display list,如下所示:

glNewList(displayList, GL_COMPILE);
    obj->draw();
glEndList();

但是,当我尝试编译它时,出现一个错误:
R6025 - pure virtual call
draw()方法是纯虚拟的。但是我想知道,为什么不能将虚拟函数放在Display list中?

编辑:

这是GUIObject类:
class GUIObject
{
protected:
    int m_id;
    int m_parentId;
    int m_width;
    int m_height;

    Point m_position;
    Point m_drawPosition;

    bool m_bEnabled;
    bool m_bVisible;

    GLuint m_displayListId;                     // Id in display lists array in TGUIManager

    virtual void onDrawStart() = 0;
    virtual void onDrawFinish() = 0;
public:
    virtual bool draw() = 0;

    void setDisplayListId(GLuint id);
    GLuint getDisplayListId();

    virtual int getWidth() const;
    virtual int getHeight() const;
    virtual bool pointInObject(const TPoint& point);

    GUIObject();

    virtual ~GUIObject();
};

GUIObject::GUIObject() :
    m_position(Point(0,0)),
    m_width(0),
    m_height(0),
{
    m_drawPosition = m_position;
    GUIManager::Instance().addObject(this);
}

GUIObject::~GUIObject()
{
}

这是Button类,它是从Component派生的,而GUIObject是从Background派生的:
class Button : public Component, public Clickable
{
private:
    std::string m_text;
    TBackground* m_pBackground;
public:
    void setText(std::string text);
    void setBackground(Background* pBg);
    Background* getBackground() const;
    void setBackgroundOnClick(Background* pBg);
    Background* getBackgroundOnClick() const;

    bool draw();

    int getFontSize() const;
    std::string getText() const;
    Button& operator=(const Button & button);

    // From Clickable
    bool wasClicked(const Point& clickPos);

    Button();
    ~Button();
};

bool Button::draw()
{
    onDrawStart();      // This needs to be called in each object

    if(!isClicked() && m_pBackground != nullptr)
    m_pBackground->draw(m_drawPosition, m_width, m_height);

    else if(m_pBackgroundOnClick != nullptr)
    m_pBackgroundOnClick->draw(m_drawPosition, m_width, m_height);

    FontManager::Instance().renderLineOfText(font, lineLength, pos, textToRender);

    onDrawFinish();     // This needs to be called in each object
    return true;
}

Button::Button() :
    TComponent(Point(0,0)),
    m_pBackground(nullptr),
    m_pBackgroundOnClick(nullptr),
    m_text("")
{
}

Button::~Button()
{
    if(m_pBackground != nullptr)
    {
        delete m_pBackground;
        m_pBackground = nullptr;
    }
}

Button& Button::operator=(const Button & button)
{
    m_position = Point(button.getPos());
    m_pBackground = new Background()

    return *this;
}

好的,我想我包括了所有必需的代码部分。

绘图内容位于draw()obj方法中。

称为addObject()的对象是在GUIObject的构造函数内作为ojit_code方法中的参数传递的对象:
GUIManager::Instance().addObject(this);

最佳答案

好的,看来我犯了一个非常愚蠢的错误。正如我在对问题的编辑中解释的那样,obj对象是在方法addObject()中作为参数传递的对象,它在GUIObject的构造函数中被调用,这意味着Button的对象本身尚未创建。编译器没有抱怨,因为GUIObject类已经声明了draw()方法,但仅在运行时发现该方法缺乏定义。

但是无论如何,感谢大家告诉我,在显示列表中调用纯虚方法是完全可以的。那帮助我找到了解决方案。

关于c++ - 显示列表,OpenGL,C++中的“R6025 - pure virtual call”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14093984/

10-11 09:22