2011-10-06 9 views
3

新しいC++プログラマーがここにあります。ユニークなクラスをマッピングし、値からサブクラスを抽出するC++

私は、次のマップ定義を持っている:

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

オプションは、私が作成した独自のクラスです。私は実際にOptionクラスを自分のマップに追加することはありません。代わりに、私はいつもOptionから継承するクラスを追加しています。たとえば、Int変数を格納するIntOptionというクラスがあります。

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

を私は

my_map["a key here"] 

を行うときには、「追加」値を返しますので、これは正常に動作します:

今私が行って、自分のマップにIntOptionを追加することは問題がありません。

ここで私の質問は、すべての善良な人々は、私は戻り値のサブクラス変数を得ることができますか?私は、次の

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

ここで問題となるのは、派生したOptionタイプが複数ある場合、dynamic_castは失敗し(nullを返す)、どのアイテムが成功するかを事前に知る必要があるということです。 – David

+0

@David正しいです。私はそれが問題の性質に固有のものだと推測しています - ユーザーはint、文字列、日付などのオプションを格納しようとしています。それがどのように使用されるかはビジネスルールです。 –