c++ - 如何在单个 vector 中存储不同的类?

标签 c++ class vector object-slicing

所以我有一个 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/

相关文章:

c++ - 如何从 QDialog 的 const 方法显示 QMessageBox?

ios - 如何确定 iOS (id) 对象的结构?

c++ - 如何在 C++ 中对命令行参数进行排序

c++ - std::deque 的排序是如何实现的?

c++ - CMake 和 Visual Studio 构建错误

c++ - 如何检查ACL是否被保护

c++ - C++ 中的英特尔 MKL 稀疏 QR 求解返回未初始化错误

java - 我的主类中有大约 10k 行代码,我应该担心吗?

java - 将对象从一个类移动到另一个类 (Java)

c++ - 用于随机插入/删除的综合 vector 与链表基准