2011-12-27 36 views
0

對,我對C++相當陌生,所以我仍然在這裏學習。如果我以錯誤的方式解決這個問題,請告訴我,但如果可能,請嘗試指向正確的方向(通過鏈接指導教程)。在地圖中存儲派生對象的C++

我一直在玩std :: map並用它來存儲對象(item)。這工作正常。問題是試圖在地圖中存儲派生項目。我已經掌握了它的工作原理,但它似乎在分割派生的對象。

所以說項目具有屬性a,b和c。食物來自具有額外屬性d和e的物品。存儲在項目地圖中時,我無法訪問d和e。編譯器說:

「錯誤:‘類項目’沒有名爲‘d’成員」

是否可以使用std ::地圖polymorphicaly或者我需要使用另一個庫像升壓? Boost看起來相當複雜,我希望在我還在學習的時候有一種方法可以用地圖來做。下面是我正在使用的一些代碼,以更清楚地表達我的意思。

地圖項目被聲明爲這樣:

typedef std::map <int, tItem*> itemMap; 

事情添加到這樣的:

Item * item = new Item (a, b, c); 
itemmap [vnum] = item; 
DerivedItem * deriveditem = new DerivedItem (a, b, c, d, e); 
itemmap [vnum] = deriveditem; 

這工作,但我不能訪問d和e衍生項目。

感謝您的幫助球員

+2

這一切都將是一場可怕的內存泄漏噩夢。您應該使用智能指針。 – 2011-12-27 12:18:52

+0

我正在使用它來學習,在程序關閉之前,地圖中的項目不會被刪除,所以不應該有內存泄漏。 – DizzyDuke 2011-12-27 16:35:43

回答

3

您可以使用dynamic_cast投回到派生類,如果你knwo它是什麼類。

dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction(); 

http://en.wikipedia.org/wiki/Dynamic_cast

如果你想這是自動完成的,你可以的std ::地圖,其中[]運營商有一個模板參數推導出一個新的模板類。但在這種情況下,你有,當你獲得該項目通過類型:

itemmap<DerivedItem>[vnum]->derivedFunction() 
+1

您應該提到這一點,函數和容器必須通過_pointers_,而不是_values_。 – 2011-12-27 11:41:56

+0

這不是我想要的答案,但它指出了我的正確方向。謝謝! – DizzyDuke 2011-12-27 16:37:18

0

您將無法訪問成員特定於DerivedItem類的Item指針。你可以投它:

val = static_cast<DerivedItem*>(itemmap[vnum])->d; 

....但這取決於知道哪些項目是哪種類型的地圖。

對於多態行爲,通常您會在派生類中重寫的父類中的方法的行爲不同。

+0

你爲什麼複製Alessandro的答案?如果這是故意的,那麼SO是錯誤的 – Ulterior 2011-12-27 11:19:54

+1

@Ulterior - 它不是重複的。(a)我的第一句和最後一句的解釋和建議並未出現在另一個答案中,(b)我的代碼行有點不同,(c)OP中的誤解只能用很多方式解釋。 SO工作正常。當另一個答案顯示時,我正在打字,我認爲這些差異是有足夠理由在此留下的。 – sje397 2011-12-27 11:26:59

+0

我會推薦'dynamic_cast'在'static_cast'上。 – 2011-12-27 11:42:38

相關問題