3

ここに新しい C++ プログラマーがいます。

次のマップ定義があります。

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

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

次のようにして、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

// getter は基本クラスではなく、Option を拡張するクラスにあるためです。

この問題を解決するにはどうすればよいですか?

typedef std::map MapType; を検討しました。

動的キャストを行う方法も、クラスへのポインターをマップに追加する方法もわかりません。

4

1 に答える 1

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 はそれを助けるかもしれません。

于 2011-10-06T02:23:14.330 に答える