2011-11-05 92 views
1

我在C++初學者,爲我創造想什麼,我有這個遊戲項目是通用的「遊戲對象」元素的集合,每個與更新虛擬方法和Draw ......然後有類繼承從它自己的這種方法定義,以便更新世界,當我只需要通過一個集合不斷循環......抽象類/不同類的類的集合?

現在看來似乎是不可能的矢量持有抽象類的集合,我試過而是保持繪製和更新方法虛擬,但如果我創建Enemy : public GameObject實例並將其添加到Vector<GameObject>並調用更新,然後我得到各種鏈接器:未定義的符號錯誤....

我不知道,有som我沒有把握......我相信這是許多應用程序需要的一種設置......你對此有何建議?我應該嘗試一種不同於Vector的收集器嗎?

非常感謝您

編輯:

針對下面的回覆,我想:

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

} 

而我得到的,因爲我之前做過:

Error 25 error LNK2001: unresolved external symbol "public: virtual void __thiscall Enemy::update(float)" ([email protected]@@[email protected]) 

Error 28 error LNK2001: unresolved external symbol "public: virtual void __thiscall GameObject::update(float)" ([email protected]@@[email protected]) 

....

有什麼建議嗎?

+0

確實含有'無效敵人::更新(浮動)文件'被編譯並與二進制聯繫。 – crazyjul

回答

1

如C++有效(斯科特邁爾斯)說,你不應該建立多態類型的數組。在你的情況下,使用vector<GameObject*>將工作。但我會建議使用auto_ptr或其他智能指針。

+1

auto_ptrs的矢量是[非常不好的主意](http://stackoverflow.com/questions/111478/)。 – fredoverflow

+0

感謝您的提示....試過了,沒有運氣....已編輯過上面的帖子 – Alex

+0

@FredOverflow您說得對,寫得太快了。 ;-)我正在考慮增強指針 – crazyjul

0

使用Vector<GameObject*>(或某些涉及引用/指針),而不是Vector<GameObject>。您不允許實例化抽象基類。

0

如果你想亞型多態性,你需要指針的載體。否則,你的物體會被切割。由於原始指針的向量是不是異常安全的,我建議共享指針的向量:

#include <vector> 
#include <memory> 
// ... 
std::vector<std::shared_ptr<GameObject>> gameObjects; 
gameObjects.push_back(std::make_shared<Enemy>());