我正在OpenGL中开发自己的菜单系统。 我想要的是将与菜单相关的所有对象都放在一个矢量中,因此我可以轻松地像这样将它们全部循环:
for (auto i : menuObjects)
{
i.checkInputs();
i.draw();
}
我尝试了其他循环方法,甚至在基类的函数中加入了this->draw();
,但显然以无限循环结束了。
我的基类基本上是这样:
class menuObject
{
public:
virtual void draw() { }
virtual void checkInputs() { }
};
继承的类是这样的:
class Button : public menuObject
{
public:
void draw()
{
... drawing here ...
}
void checkInputs()
{
... checking inputs here ...
}
};
这是我将其保存在矢量中的方法:
std::vector<menuObject> menuObjects = {
Button(... parameters here ...)
};
它永远不会进入重载函数。 我宁愿在自己的向量中没有每个不同的菜单对象。 有任何想法吗? <3
答案 0 :(得分:3)
您遇到的问题是您不能在向量中直接存储不同类型的对象。
std::vector<menuObject> menuObjects = {
Button(... parameters here ...)
};
上面的代码将Button切成menuObject。当派生类被赋值给基类时,就会发生对象切片。与派生类关联的所有信息都将丢失。
您要做的是使用指针来允许多态。
因此,您的std::vector<menuObjects>
将成为std::vector<menuObjects*>
或vector<std::unique_ptr<menuObjects>
。如果此向量将负责管理menuObjects的生存期,则使用后者;否则,请使用前者。
侧面说明:如果您确实使用了前一个选项(即原始指针),请确保在menuObject的生命周期结束之前,从向量中移除无效的指针,然后再向量的生存期结束。