2011-12-27 11 views
0

私はかなり新しいC++ですので、まだここで学んでいます。私が間違った方法でこのことをしているなら、教えてください。しかし、可能であれば、正しい方向に私を向けるようにしてください(チュートリアルへのリンクがあります)。C++は派生オブジェクトをマップ内に格納します

私はstd :: mapで遊んでいて、オブジェクト(アイテム)を格納するために使っています。これは正常に動作します。問題は、派生アイテムをマップ内に格納しようとしていることです。私はそれが働いているが、それは派生したオブジェクトをスライスしているようだ。

アイテムには、属性a、b、およびcがあります。食物は特別な属性dとeを持つアイテムから派生します。私はそれがアイテムのマップに格納されているときにdとeにアクセスすることはできません。コンパイラは言う:

「エラー 『クラス項目が』 『D』という名前のメンバーを持っていない」それはSTD ::地図polymorphicalyを使用することが可能であるか、私はブーストのような別のライブラリを使用する必要がありますか?ブーストはやや複雑に思えますが、私はまだ学んでいる間にマップでそれを行う方法があることを望んでいました。私が意味することをより明確にするために、私が演奏しているコードのいくつかを示します。アイテムの

地図をように宣言されています。

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

これは動作しますが、私は派生アイテムのDとEにアクセスすることはできません。

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

物事はこのようにそれに追加されます。ヘルプみんな

+2

これはすべて、ひどいメモリリークの悪夢になります。代わりにスマートポインタを使用する必要があります。 –

+0

私はそれを学ぶために使用しています、マップ内の項目は、プログラムが閉じられるまで削除されないので、メモリリークがあってはいけません。 – DizzyDuke

答えて

3

ため

おかげであなたはそれが何であるか、クラスknwo場合は、派生クラスにキャストバックするdynamic_castを使用することができます。

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

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

あなたはこれを自動的に行うことがしたい場合は、[]オペレータがテンプレート引数を持っているのstd ::マップから新しいテンプレートクラスを派生することができます。

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

これについて言及する必要があります。関数とコンテナは_value_ではなく_pointers_を渡し/保持する必要があります。 –

+0

これは私が欲しかった答えではありませんが、正しい方向に私を指摘しました。ありがとう! – DizzyDuke

0

あなたがItemポインタでDerivedItemクラスに特定のメンバーにアクセスすることはできません。しかし、この場合には、あなたがアイテムを取得するときに型を渡す必要があります。あなたはキャストすることができます:

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

....しかし、どのアイテムがマップにどのタイプであるかによって異なります。

多態性の動作では、通常、親クラスのメソッドが、異なる動作をする派生クラスでオーバーライドされます。

+0

なぜあなたはアレッサンドロの答えを複製しましたか?これが意図的な場合、SOは間違って動作しています – Ulterior

+1

@上 - 重複していません。(a)最初の文章と最後の文章の説明と助言は、他の答えにはない、(b)私のコード行は少し違う、(c)OPの誤解は多くの点で説明できる。 SOは正常に動作しています。私は他の答えが示されたときにこれをタイプしていました、そして、私はそれらの違いがここにこれを残す十分な理由であると考えました。 – sje397

+0

'static_cast'より' dynamic_cast'をお勧めします。 –

関連する問題