我正在为我拥有的所有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/