所以我有一个 vector ,里面装满了我游戏的所有对象;诸如玩家对象、敌人对象、墙壁等... vector 中的所有对象都是 Framework
的子项,所以我制作了 vector 类型 Framework
因为那是对他们来说最接近通用数据类型的东西。
问题是它没有从它存储的对象运行覆盖函数。所以我用谷歌搜索发现显然我是通过将它们存储为 Framework
来进行对象切片的。那么我的问题是,如何将所有这些对象存储在一个列表中?
仅供引用,这是调用应该被覆盖的函数的地方。
for (vector<Framework>::iterator num = gameObjects.begin(); num != gameObjects.end(); ++num)
{
//The current thing
Framework currentObject = *num;
currentObject.frameEvent();
currentObject.frameEndEvent();
currentObject.drawEvent();
}
提前致谢。
最佳答案
你必须存储指针(Framework*
),或者std::shared_ptr< Framework >
(可能是 std::unique_ptr< Framework >
)实例。这允许使用虚拟调用和 late binding - 这意味着当您引用您的对象时,将在运行时确定要调用的正确函数。不要忘记创建函数 virtual
然后,你的代码(以类似的方式)
for (vector< Framework* >::iterator num = gameObjects.begin(); num != gameObjects.end(); ++num)
{
Framework* currentObject = *num;
currentObject->frameEvent();
currentObject->frameEndEvent();
currentObject->DrawEvent();
}
但是,我会推荐这样的东西(需要 c++11)
vector< std::unique_ptr< Framework > > gameObjects;
...
for (auto & currentObject : gameObjects)
{
currentObject->frameEvent();
currentObject->frameEndEvent();
currentObject->DrawEvent();
}
无论使用何种类型,最后一个(循环范围)都应该有效(您可以使用普通指针或 shared_ptr 或 unique_ptr,如示例所示)。
如果您有兴趣使用unique_ptr
,请注意,为了将这些存储在 std::vector
上, 你必须使用 std::move
, 因为只能有一个 std::unique_ptr
的实例(顾名思义)。 Consult this answer以防出现问题。
关于c++ - 如何在单个 vector 中存储不同的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776541/