CArrayとCTypedArrayの違いについて

[戻る]
はまち 2002/04/24(水) 02:15:06
先日は、大変お世話になりました。

CArrayについて調べているのですが、MSDNを読んでいく中でどうしてもわからないことがあり
今回も質問させていただこうと思いました。それは、CArrayとCTypedPtrArrayの違いについて
です。今、プログラム内でnew演算子を使って動的に作ったオブジェクトを配列管理したいと思
っているのですが、どちらを使っていいのか迷っています。たとえば、どこからも派生していな
い自作クラス、CKokyakuDataクラスがあったとし、そのオブジェクトを配列管理するとすば、

CArray<CKokaykuData*,CKokaykuData*> myArray;
CTypedPtrArray<CPtrArray, CKokaykuData*> myArray;

とどちらでもできるのではないかと思います。それ以外の違いは、「MFC コレクション クラス
の特徴」にあるCArrayのタイプセーフ付が×になっていることと、CTypedPtrArrayのシリアル
化ができるかが△になっていることぐらいだと思うのですが、実際、このあたりもよく意味が
わかりません。ほかのページの「コレクション : テンプレート ベースのクラス」では
CArrayはタイプセーフであると紹介されています。今のところシリアル化なども考えていな
いので、△のところもどちらでもいいかと思っているのですが、何かそれ以外で根本的な大きな
違いがあるのでしょうか。

よろしくお願いします。環境はWin98SE, VC++6.0です。

dairygoods 2002/04/24(水) 10:04:37
根本的な違いはありません。
シリアル化への対応方式が違うだけです。

> CArray<CKokaykuData*,CKokaykuData*> myArray;

これをシリアル化するとポインタが単に数値として保存されますが、
プログラムを終了すれば、ポインタが指す先にあるものは開放されます。
プログラムを再実行してポインタの配列を復元しても、
そのポインタは当然無効です。

> CTypedPtrArray<CPtrArray, CKokaykuData*> myArray;

CTypedPtrArrayの場合、

CPtrArrayをBASE_CLASSにすると、上記の危険な操作を
うっかり行わないように、シリアル化が禁止されています。

CObArrayをBASE_CLASSにすると、
保持ポインタは全てCObjectの派生クラスへのポインタになりますので、
各ポインタに対してSerializeを呼び出すことができます。
これにより、ポインタ自身ではなくポインタが指す先にあるオブジェクトを
シリアル化することができます。

はまち 2002/04/25(木) 00:12:22
[[解決]]
dairygoodsさん、明快お返事、ありがとうございました。シリアル化の違いに大きな差が
あったんですね。シリアル化は、実際、まだやったことがなかったので、なかなかイメージ
することができなかったのですが、dairygoodsさんのポインタの説明を聞くと、とても
イメージすることができました。僕なりに何度もMSDNを読んだつもりでしたが、まだまだ
勉強不足だなとつくづく感じました。
 最後になりましたが、前回同様、ありがとうございました。

はまち 2002/04/25(木) 22:31:07
 すでに解決ボタンを押してしまったのですが、もし、よかったら二つだけ確認させて下さい。

ということは、CObjectから派生した自作クラス、CMyObjectがあったとしたら、

CArray<CMyObject*, CMyObject*> myArray
と
CTypedPtrArray<CObArray, CMyObject*> myArray

の二つは、どちらもシリアル化ができそうな気がします。この二つはほとんど同じ物なのでしょ
うか。
 それと、CArrayとCTypedPtrArrayをキーワードに検索しても、CTypedPtrArrayの方はあま
り見つからないのですが、皆さんは、あまり、CTypedPtrArrayの方は使われないのでしょう
か。
よろしくお願いします。

古いスレッドには追加発言できません。