2011-10-06 45 views
3

這裏是新的C++程序員。C++映射唯一類並從值中提取子類

我有以下的地圖定義:

typedef std::map<std::string, Option> MapType; 
MapType my_map 

選項是唯一的類我創建。我從來沒有真正將Option類自己添加到我的地圖中。相反,我總是添加一個繼承自Option的類,例如我有一個名爲IntOption的類,它存儲了一個int變量(它的全部變量)。

現在我有沒有問題,增加IntOption到我的地圖做:

IntOption add; 
my_map.insert(std::pair<string, IntOption>("a key here", add)); 

這工作得很好,因爲當我做了

my_map["a key here"] 

它會返回值「添加」。

現在我的問題給你所有的好人是如何得到的返回值的子類變量?我可以做以下

my_map["a key here"].getVariableA(); // this is in the base class Option. 

,但我不能這樣做

my_map["a key here"].getIntVariable(); //this fails because it doesnt recognize the 

//吸氣劑,因爲它不是基類,但類擴展選項。

我該如何解決這個問題?我已經考慮過 typedef std :: map MapType;

買我不知道如何做動態鑄造,也沒有如何將指針添加到類的地圖。

回答

2

它不會按照您設置的方式工作。該地圖假定它只保存Option的實例,因此它將丟棄您嘗試發送的任何IntOption數據。你將不得不回退到選項的指針。

typedef std::map<std::string, Option*> MapType; 

my_map["a key here"] = new IntOption(); 

IntOption *opt = dynamic_cast<IntOption*>(my_map["a key here"]); 

請注意,您必須現在處理內存管理,並決定何時取消分配選項。 std :: auto_ptr可能有幫助。

+2

您不能在映射中存儲auto_ptr(它不符合CopyConstructible要求)。 shared_ptr或unique_ptr會很好。 –

+0

問題在於,如果您有多個派生選項類型,dynamic_cast將會失敗(返回null),並且您需要事先知道哪個項目是哪種類型才能成功。 – David

+0

@大衛,這是正確的。我猜這是問題的本質固有的 - 用戶試圖存儲可以是整數,字符串,日期等的選項。它如何使用是一項業務規則。 –