CArrayの要素に派生クラスのオブジェクトを使うには?

解決


masa  2003-02-17 19:15:00  No: 51071  IP: [192.*.*.*]

CArrayの要素として、下のように自作の基本クラスを使うときはうまくいくのですが、

  CBase base;
  CArray<CBase, CBase&> baseArray;
  baseArray.Add(base);

要素が自作の派生クラスだとうまくいきません。
要素数は正常に一つ増えているのですが、その中身を見ると、メンバ変数がデフォルト値になっており、正常にAddされていません。
まるで新規オブジェクトが追加された感じです。

要素として派生クラスを使う際の注意などありましたら教えてもらえないでしょうか。
CArrayのAddが呼ばれた時の内部の動きなどが解説されているサイトなどもありましたら、よろしくお願いします。

編集 削除
YuO  2003-02-17 22:06:48  No: 51072  IP: [192.*.*.*]

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;
という形になります。

編集 削除
YuO  2003-02-17 22:27:26  No: 51073  IP: [192.*.*.*]

CPtrArrayとかは使えないのね……。
#CPtrArrayはvoid *だった……。

というわけで,CArrayにポインタを突っ込むか,boostとvectorを使うか,
といったところです。

編集 削除
masa  2003-02-18 09:47:59  No: 51074  IP: [192.*.*.*]

YuOさんありがとうございます。

>というわけで,CArrayにポインタを突っ込むか,boostとvectorを使うか,
>といったところです。

ポインタを突っ込んでやってみようと思います。
boostは知らなかったので、これから調べてみます。

本当にありがとうございます。

編集 削除
REE  2003-02-18 10:53:34  No: 51075  IP: [192.*.*.*]

CTypedPtrArrayを使えばよいかと

編集 削除