2012-07-31 110 views
2

我有一個Component類,它是父類,例如Sprite類。 Sprite也有各種兒童動畫,但這不是這個問題的重點。我也有一個組件經理,持有map<string, Component>。我存儲了我在該地圖中創建的每個組件。目前有12種類型的組件,但會增加。所有從同一個類繼承的對象映射,調用對象方法而不是父對象; C++

我的Component類有virtual void draw()update()功能,在這種情況下Sprite也是一樣。但是,當我循環查看組件圖時,它只調用Componentdraw()update()

我還沒有真正能夠找到一個實際上爲我工作的答案呢。

+2

你在地圖或對象中存儲指針嗎?你真的應該存儲指針,否則你會遇到'對象切片'問題,這與你描述的症狀完全相同。 – jahhaj 2012-07-31 20:42:54

回答

1

你的價值經歷object slicing - 由於你的map只存儲Component對象,這些對象不包括任何由Component子類提供的信息。一般來說,子類型多態只能通過指針類型工作,而不是值類型。所以,你需要通過指針實例存儲,最好std::map<std::string, std::unique_ptr<Component>>

components["example"] = std::unique_ptr<Component>(new Example()); 

如果使用非C++編譯器11,使用std::map<std::string, Component*>

components["example"] = new Example(); 

並確保您deleteComponent清理過程中的對象,例如組件管理器的析構函數。 C++ 03:

for (std::map<std::string, Component*>::const_iterator i = components.begin(); 
    i != components.end(); ++i) 
    delete i->second; 

C++ 11:

for (const auto& i : components) 
    delete i.second; 
+0

感謝您的幫助和解釋與例子。 – Baraphor 2012-08-02 13:47:24

0

聽起來像切片給我,嘗試存儲指向您的組件在地圖上的指針。

1

您的問題是相當普遍的,這就是所謂的切片。該地圖不包含原始對象,它包含副本的對象。該副本不是您嘗試插入地圖的類型,而是您爲地圖聲明的基本類型。

唯一的解決方法是存儲指針而不是對象本身。通常這是使用智能指針,如shared_ptr,以便自動清理。