基底クラスのポインタから、継承クラスのサイズを求める

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ma

基底クラスのポインタから、継承クラスのサイズを求める

#1

投稿記事 by Ma » 16年前

またお世話になります<(_ _)>

BCC Developer と DXライブラリ を使用している者ですが、
今、基底クラス enemy のポインタの集合を、標準ライブラリのdequeを用いて保存しています。

deque<enemy*> list;

enemy というクラスは、多数のクラスに継承しています。
listは、enemyを継承したクラスのポインタの集まりです。

つまり、goblin がenemyを継承したクラスとすると、

enemy* temp = new goblin();
list.push_back(temp);

のような感じです。(規約は読んでます。この方が読みやすいと思うので…)


継承したクラスによって、メンバー変数が変わりますから、ファイルサイズも変わってくるのですが、
このlistに保存されているポインタだけで、継承したクラスのサイズを求める事はできるのでしょうか?

sizeof(list[0]) ではポインタなので4バイト
sizeof(*list[0]) では、クラスenemy のサイズになってしまいます。

継承したクラス自体の重さはどのようにして求められるでしょうか?



*質問した理由
このデック list にある情報をすべてファイルに書き出そうと思ったのですが、
deque の中身を保存して完全に復元するには、中のデータを一個一個保存しなくてはならないと思ったため、
ひとつひとつのデータのサイズを求めようとした時に、つまづきました。
もし、ひとつひとつ保存する必要がない良い方法があるなら是非ご教授お願いします<(_ _)>


自分で考えてみた方法は、すべてのクラスに、ある仮想関数を設置して、その関数から、
どのクラスのポインタであるのか判断できるようすれば、サイズも分かる。という方法ですが、
なんだか、もっと良い方法がある気がします。

もしくは、そのクラスのサイズ自体返すとか。
(↑ return sizeof(this); とすればできるのかな?)

よろしくお願いします<(_ _)>

たかぎ

Re:基底クラスのポインタから、継承クラスのサイズを求める

#2

投稿記事 by たかぎ » 16年前

(スマートポインタを用いる方法も含めて)何らかの方法でサイズを埋め込むか、サイズを返す仮想関数を用意する以外の方法は原則としてありません。

それ以外の方法も2つありますが、いずれもあまりお勧めしません。

1. クラスにoperator newを定義して、各オブジェクトの外部でサイズを管理する。

2. クラスにoperator delete(void*, std::size_t)を定義して、いったんdeleteしてみる。
 ただし、本当に解体されないように、サイズ確認の際には、事前にフラグを設定しておくなどする(決してお勧めしない方法)。

たかぎ

Re:基底クラスのポインタから、継承クラスのサイズを求める

#3

投稿記事 by たかぎ » 16年前

事前にどんな派生クラスがあるのか把握できることが前提であれば、もうひとつ方法があります。

typeidでstd::type_infoのconst参照が取れますので、個々の派生クラスのtypeidと比較して、一致するものを探せば何とかなります。
ただ、このような型スイッチは禁じ手ともいえる方法なので、やはりお勧めはしません。

TOMONORI

Re:基底クラスのポインタから、継承クラスのサイズを求める

#4

投稿記事 by TOMONORI » 16年前

自分は使ったことが無いのですが、boostのReflectionとか使えないですかね?

Ma

Re:基底クラスのポインタから、継承クラスのサイズを求める

#5

投稿記事 by Ma » 16年前

>スマートポインタ
スマートポインタって便利ですね!←いままで知らなかったw


>typeid
typeid は、以前避けた方がいいと読んだ事があります。
やはり禁じ手なのですか。。

>boostのReflection
自分も使った事ないです><



サイズを返す仮想関数を用意するのが、一番簡単そうですね。
ありがとうございました<(_ _)>

閉鎖

“C言語何でも質問掲示板” へ戻る