draw(); glEndList(); 但是-6ren">
gpt4 book ai didi

c++ - 显示列表、OpenGL、C++ 中的 "R6025 - pure virtual call"

转载 作者:太空狗 更新时间:2023-10-29 21:46:56 29 4
gpt4 key购买 nike

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

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,而 Component 派生自 GUIObject:

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;
}

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

绘制内容在Backgrounddraw()方法中。

名为 obj 的对象是在 GUIObject 的构造函数中作为参数传递给 addObject() 方法的对象:

GUIManager::Instance().addObject(this);

最佳答案

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

但是无论如何,感谢你们所有人告诉我在显示列表中调用纯虚方法非常好。这帮助我找到了解决方案。

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com