我是C ++的初学者,对于这个我正在创建的游戏项目,我想要的是一个通用的“GameObject”元素的集合,每个元素都有Update和Draw的虚拟方法......然后有类继承自己对这些方法的定义,以便在更新世界时我只需要保留一个集合来循环...
似乎Vector无法保存抽象类的集合,我试图将Draw和Update方法保持为虚拟,但是如果我创建一个Enemy : public GameObject
实例并将其添加到{{ 1}}并调用update然后我得到各种Linker:undefined symbol errors ....
我不知道,有些东西我没有抓住......我确信这是一种很多应用程序需要的设置....你对此有何建议?我应该尝试使用与Vector不同类型的收藏家吗?
非常感谢
编辑:
在回复以下回复时,我尝试了:
Vector<GameObject>
我得到了,就像我之前做的那样:
class GameObject{
....
virtual void update(float t):
....
}
//-------------------------------------------
class Enemy: public GameObject{
.....
void update(float d);
.....
void Enemy::update(float d){
//Have a breakpoint here
}
//-------------------------------------------
class World{
...
vector<GameObject*> gameObjects;
...
}
//-------------------------------------------
class Level{
World levelWorld;
....
Level(){
levelWorld = new World();
}
...
Enemy* en = new Enemy();
levelWorld->visibleObjects.push_back(en);
levelWorld->visibleObjects.at(0)->update(0);
}
...
有什么建议吗?
答案 0 :(得分:1)
如Effective C ++(Scott Meyers)所述,您不应该创建多态类型的数组。在您的情况下,使用vector<GameObject*>
将起作用。但我建议使用auto_ptr或任何其他智能指针。
答案 1 :(得分:0)
使用Vector<GameObject*>
(或涉及引用/指针的内容)而不是Vector<GameObject>
。您不能实例化抽象基类。
答案 2 :(得分:0)
如果你想要子类型多态,你需要一个指针向量。否则,您的对象将被切片。由于原始指针的向量不是异常安全的,我推荐一个共享指针向量:
#include <vector>
#include <memory>
// ...
std::vector<std::shared_ptr<GameObject>> gameObjects;
gameObjects.push_back(std::make_shared<Enemy>());