gpt4 book ai didi

c++ - 如何在一个数组/容器中使用不同的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:03 24 4
gpt4 key购买 nike

我是 C++ 的初级程序员,正在制作我的第一个 2d 游戏(只是为了学习语言的基础知识,我没有计划任何大的 :P)。我遇到了第一个问题,我无法在互联网上找到解决方案:实体有一个主类:

class entity
{
//something there
};

还有一些具体怪物、玩家等的派生类

class zombie : public entity
{
//...
};
class mutant : public entity
...
class player : public entity
...

现在的问题是如何为所有类型的实体制作一个数组(或一些容器/任何东西)?我的意思是,如果所有的怪物和玩家对象都来自“实体”类,那么碰撞就会很简单:

std::vector<entity> entityTbl;
entityTbl.push_back( entity(...) );
...
entityTbl.push_back( entity(...) );

for(int i=0;i<entityTbl.end();i++)
for(int k=0;k<entityTbl.end();k++)
entityTbl[i].collision(entityTbl[k]); //some collision function

但是如果我有“僵尸”、“突变体”、“玩家”等不同类型的对象,我应该如何以简单的方式(我的意思是在一个数组/容器中)检查这些碰撞?在这种情况下,我不能再使用“实体”容器了,原因有两个:

  1. 我希望“类实体”是抽象的
  2. 如果我使用这个容器制作播放器对象,我就不能使用“播放器类”中的函数。

希望你能明白我的意思。 :)感谢您提供的帮助建议,对于任何语言错误,我们深表歉意 - 英语不是我的母语。

最佳答案

您不能拥有抽象类的实例。而不是像您的示例那样,尝试以下操作:

 std::vector<std::shared_ptr<entity> > entityTbl;
entityTbl.push_back( new zombie(...) );
entityTbl.push_back( new mutant(...) );

因为上面的示例只适用于 ,作为后备解决方案,您可以使用

 std::vector<entity*> > entityTbl;

填充表格的代码是相同的。但是您需要在 entityTbl 被破坏(超出范围)之前从 delete 项目:

 for(std::std::vector<entity*> >::iterator it = entityTbl.begin(); 
it != entityTbl.end();
++it) {
delete *it;
}

关于c++ - 如何在一个数组/容器中使用不同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862983/

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