2012-05-04 49 views
4

背景信息: 我和幾個朋友正在建立這個平臺的遊戲在C++的幫助OCH SFML和Box2D的一所學校分配。 其中一個要求是我們遵循「MVC模式」。C++向量遍歷抽象類

我們已經創建了類,如子彈和字符的模型。 BulletView和CharacterView(都繼承了sf :: Drawable這是一個抽象類)。

,而不是複製的代碼繪製的,有兩個方法drawBullets和drawCharacter這樣

void WorldView::drawBullets() 
{ 
    std::vector<BulletView*>::iterator it; 
    for (it = bullets.begin() ; it < bullets.end(); it++) 
     window->draw(**it); 
} 

void WorldView::drawCharacters() 
{ 
    std::vector<CharacterView*>::iterator it; 
    for (it = characters.begin() ; it < characters.end(); it++) 
     window->draw(*it); 
} 

我會用polymorhism這將是這個樣子更像一個通用的方法:

void WorldView::drawVector(const std::vector<sf::Drawable*>& vector) 
{ 
    std::vector<sf::Drawable*>::iterator it; 
    for (it = vector.begin() ; it < vector.end(); it++) 
     window->draw(**it); 
} 

的bulletView向量聲明如下:

std::vector<BulletView*> bullets; 

Can儘管如此,我還是不能這樣做。我對C++很陌生,所以請留下仁慈!我試過搜索,但沒有找到非常具體的答案。

錯誤,我得到在編譯時。

錯誤8錯誤C2679:二進制 '=':沒有操作員發現它接受一個右手>類型的操作數 '的std :: _ Vector_const_iterator < _Myvec>'(或沒有可接受>轉換)C:\用戶\ niklas \ multiplaya \ sfml測試\ sfml測試\視圖\ worldview.cpp 409> 1 SFML_Test

錯誤7錯誤C2664:'mp :: WorldView :: drawVector':無法將參數1從>'std ::矢量< _Ty>」到 '常量性病::矢量< _Ty> &' C:\用戶\尼古拉斯\ multiplaya \ SFML>測試\ SFML測試\視圖\ worldview.cpp 402 1 SFML_Test

+0

'std :: vector項目符號;'不是有效的聲明:什麼是向量的模板類型? – James

+0

@Outopulated它是一個格式問題,我修正了。 – juanchopanza

回答

5

的問題是,polimorphism不會在工作!向量的級別,但是在它們包含的指針的級別上。所以std::vector<Derived*>永遠不能作爲std::vector<Base*>傳遞,因爲它們是完全不同的類型。但是,您可以填寫std::vector<Base*>指針Derived*

所以,你應該聲明你的子彈向量

std::vector<Drawable*> bullets; 

BulletView*填充它,例如:

bullets.push_back(new BulletView(some args)); 

drawVector(bullets); 

注意:在上面的代碼,我回避的問題動態分配對象所有權。很明顯,在適當的時候必須有一些機制來刪除BulletViews

+0

進行比較。我可能最終會用類似於「GameObjectView」類的東西來繼承sf :: Drawable類。感謝你的回答! –

1

您在模仿Composite Design-Pattern

但是你的錯誤是:你應該寫更換< =,因爲它是一個迭代不是INT

void WorldView::drawBullets() 
{ 
    std::vector<BulletView*>::iterator it; 
    for (it = bullets.begin() ; it != bullets.end(); it++) 
     window->draw(**it); 
} 

void WorldView::drawCharacters() 
{ 
    std::vector<CharacterView*>::iterator it; 
    for (it = characters.begin() ; it != characters.end(); it++) 
     window->draw(*it); 
} 
I would like a more generic method using polymorhism which would look something like this: 

void WorldView::drawVector(const std::vector<sf::Drawable*>& vector) 
{ 
    std::vector<sf::Drawable*>::iterator it; 
    for (it = vector.begin() ; it != vector.end(); it++) 
     window->draw(**it); 
} 
+0

矢量具有隨機訪問迭代器,它可以與'operator <' –

2

您得到的錯誤是由您的for循環中的作業it = vector.begin();產生的。問題是您正試圖將iteratorit)指定爲const iteratorvector.begin())。您無法使用const迭代器迭代數據結構,因爲其值在每次迭代中都會更改。當使用迭代器遍歷數據結構時,您應該使用operator !=而不是operator <

如果您從const std::vector& vector刪除const事情應該工作得很好。

希望這會有所幫助!

+0

謝謝!這個問題似乎是@ juanchopanza之前說過的。 –

3

而不是使用多態載體,使用模板功能:

template <typename T> 
void WorldView::drawVector(const std::vector<T*>& vector) 
{ 
    typename std::vector<T*>::iterator it; 
    for (it = vector.begin() ; it < vector.end(); it++) 
     window->draw(**it); 
} 

順便說一句 - 原始指針的向量看起來很可疑我。誰擁有它們(誰創造它們,誰負責刪除它們)?考慮使用值的向量或boost::ptr_vector