0

そうです、私は c++ にかなり慣れていないので、まだここで学んでいます。これについて間違った方法で行っている場合は教えてください。ただし、可能であれば正しい方向に向けるようにしてください (チュートリアルへのリンクを含む HPAPS など)。

私は std::map をいじっていて、それを使ってオブジェクト (アイテム) を保存しました。これはうまくいきます。問題は、派生アイテムをマップ内に格納しようとすることです。私はそれを機能させましたが、派生オブジェクトをスライスしているようです。

たとえば、item に属性 a、b、c があるとします。food は、追加の属性 d および e を持つ item から派生します。アイテムのマップに格納されている場合、d と e にアクセスできません。コンパイラは次のように述べています。

「エラー: 'class item' には 'd' という名前のメンバーがありません」

std::map を多態的に使用することは可能ですか、それともブーストのような別のライブラリを使用する必要がありますか? ブーストはかなり複雑に思えます。私がまだ学習している間にマップでそれを行う方法があることを望んでいました。これは、私が何を意味するのかを明確にするために、私が遊んでいるコードの一部です。

アイテムのマップは次のように宣言されます。

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 にアクセスできません。

助けてくれてありがとう

4

2 に答える 2

3

dynamic_cast派生クラスが何であるかがわかっていれば、派生クラスにキャストバックするために使用できます。

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

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

これを自動的に実行したい場合は、[]演算子がテンプレート引数を持つ std::map から新しいテンプレート クラスを派生させることができます。ただし、この場合、アイテムを取得するときに型を渡す必要があります。

itemmap<DerivedItem>[vnum]->derivedFunction()
于 2011-12-27T11:13:11.023 に答える
0

DerivedItemクラス固有のメンバーにItemポインターでアクセスすることはできません。あなたはそれをキャストすることができます:

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

....しかし、それは、どのアイテムがマップ内のどのタイプであるかを知ることに依存します。

ポリモーフィックな動作の場合、通常、親クラスのメソッドが派生クラスでオーバーライドされ、動作が異なります。

于 2011-12-27T11:15:17.277 に答える