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

解決


masa  2003-02-18 04:15:00  No: 51071

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

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

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

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


YuO  2003-02-18 07:06:48  No: 51072

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-18 07:27:26  No: 51073

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

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


masa  2003-02-18 18:47:59  No: 51074

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

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

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

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


REE  2003-02-18 19:53:34  No: 51075

CTypedPtrArrayを使えばよいかと


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加