CArrayの要素として、下のように自作の基本クラスを使うときはうまくいくのですが、
CBase base;
CArray<CBase, CBase&> baseArray;
baseArray.Add(base);
要素が自作の派生クラスだとうまくいきません。
要素数は正常に一つ増えているのですが、その中身を見ると、メンバ変数がデフォルト値になっており、正常にAddされていません。
まるで新規オブジェクトが追加された感じです。
要素として派生クラスを使う際の注意などありましたら教えてもらえないでしょうか。
CArrayのAddが呼ばれた時の内部の動きなどが解説されているサイトなどもありましたら、よろしくお願いします。
CArrayなりstd::vectorなりに派生型を渡すことは出来ません。
class Base { /* ... */ };
class Derived : public Base { /* ... */ };
Base b;
Derived d;
b = d;
とやっているのと,実質的に同じです。
#情報のスライスが起きる。
派生を扱うなら,ポインタを利用するのがよいです。
CPtrArrayってのがあるので,これが使えるのではないでしょうか?
標準C++であれば,boostからshared_ptrを用意して,
std::vector<boost::shared_ptr<Base> > baseArray;
という形になります。
CPtrArrayとかは使えないのね……。
#CPtrArrayはvoid *だった……。
というわけで,CArrayにポインタを突っ込むか,boostとvectorを使うか,
といったところです。
YuOさんありがとうございます。
>というわけで,CArrayにポインタを突っ込むか,boostとvectorを使うか,
>といったところです。
ポインタを突っ込んでやってみようと思います。
boostは知らなかったので、これから調べてみます。
本当にありがとうございます。
CTypedPtrArrayを使えばよいかと
ツイート | ![]() |