動的にobjectのclassを判定したいですが

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

動的にobjectのclassを判定したいですが

#1

投稿記事 by DDK » 18年前

お久しぶりです。

最近すごい悩んでいることあります。
何かというと
例えば、
void * pt;
を定義して

class A, class B, class C
のobject(即ちinstance)のpointerをptに代入して、
実行するとき(run time)に ptが指しているobjectが
class Aのものか、Bのものか確認できるようにしたいですが、
typeid だといつも「void *」として判定されるようですね。

なにかいい方法あるのでしょうか。

環境:VC2005

お願いします!

tk-xleader

Re:動的にobjectのclassを判定したいですが

#2

投稿記事 by tk-xleader » 18年前

void*はポインタを格納する以外に情報(型に関する)がないので、それは無理だと思います。型に関する情報と言うのは
ポインタを参照する時に型が分からないと参照できないので、int*のintには、これはint型へのポインタであるということ
を、識別させる役割があるのです。void*が参照できないのはそういうわけがあり、そこには何かしらのポインタ値以外の
情報はありません、なので、void*に入っているポインタ値から型を判別するのは、たぶん無理、または相当の難易度となると思います。

バグ

Re:動的にobjectのclassを判定したいですが

#3

投稿記事 by バグ » 18年前

いっその事、各クラスに同名の判別用のメンバ関数を追加して戻り値で判別するとかどうでしょう…面倒か…(笑)

tk-xleader

Re:動的にobjectのclassを判定したいですが

#4

投稿記事 by tk-xleader » 18年前

>いっその事、各クラスに同名の判別用のメンバ関数を追加して戻り値で判別するとかどうでしょう…面倒か…(笑)
たぶんvoid*から取り出すにはキャストが必要だと思うんですけど。たぶんキャストが必要な時点でそれはできなくなると思います。

たかぎ

Re:動的にobjectのclassを判定したいですが

#5

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

一度void*に変換してしまうと、元の型情報は失われてしまいます。
元の型情報を保存したいのであれば、別に管理する以外にありません。
例えば、
#include <utility>
#include <typeinfo>
using namespace std;

class A
{
  ...
} a;

std::pair<void*, const std::type_info*> x(&a, &typeid(a));
のようにです。

DDK

Re:動的にobjectのclassを判定したいですが

#6

投稿記事 by DDK » 18年前

みなさんのご返答をお伺いしますと
現時点のC++言語仕様自身には解決の仕組みはないということですね?
VC2005のような拡張したC++にも動的にobjectの中身(本当の所属class)を確定する文は
ないでしょうか。

VC2005の拡張仕様に詳しい方いらっしゃいましたら、一言でも
お願い致します

たかぎ

Re:動的にobjectのclassを判定したいですが

#7

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

> VC2005のような拡張したC++にも動的にobjectの中身(本当の所属class)を確定する文は
> ないでしょうか。

拡張というのは、(原則として)規格厳密合致プログラムの挙動を変えることはありません。
その意味で、一度void*に変換してしまえば型情報は必ず落ちます。

ほら

Re:動的にobjectのclassを判定したいですが

#8

投稿記事 by ほら » 18年前

横取り申し訳ない、
void * pointer だめなら、
ほかに、何かなんでも入れられるようなもの(handler? container? ----名前は知らないだけど)
も存在するのでしょうか。

たかぎ

Re:動的にobjectのclassを判定したいですが

#9

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

> ほかに、何かなんでも入れられるようなもの(handler? container? ----名前は知らないだけど)
> も存在するのでしょうか。

boost::anyがそうです。
これならポインタに限らず、コピーコンストラクタを持ち、代入可能なあらゆるオブジェクト型を扱えます。

DDK

Re:動的にobjectのclassを判定したいですが

#10

投稿記事 by DDK » 18年前

たかぎさん
お世話になっております。
>boost::anyがそうです。

1点だけ確認させていただきます。
boost::anyを利用する場合、代入してから、
ある時(run time)その代入しているobjectの所属classを知ることができますか。

宜しくお願いします

たかぎ

Re:動的にobjectのclassを判定したいですが

#11

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

> ある時(run time)その代入しているobjectの所属classを知ることができますか。

できます。
boost::any::typeメンバ関数を使えば、そのとき格納されているオブジェクトの型に応じた、std::type_infoのconst参照を返します。

DDK

Re:動的にobjectのclassを判定したいですが(お礼)

#12

投稿記事 by DDK » 18年前

たかぎ さま
よくわかりました。
最終的な決め手はやはりtype_infoですね!

ありがとうございました

閉鎖

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