抽象类/不同类型的类的集合?

时间:2011-11-05 16:28:42

标签: c++ inheritance containers

我是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);

}

...

有什么建议吗?

3 个答案:

答案 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>());