2010-12-26 3 views
0

私はオブジェクト(またはタイプ)の種類を知りたい私は私のリストに私は、この書いている:リスト内のオブジェクトの型を知るには?

void **list; //list of references 
list = new void * [2]; 
Foo foo = Foo(); 
const char *not_table [] = {"tf", "ft", 0 }; 

list[0] = &foo; 
list[1] = not_table; 

if (dynamic_cast<LogicProcessor*>(list[0])) { //ERROR here ;(
    printf("Foo was found\n"); 
} 
if (dynamic_cast<char*> (list[0])) { //ERROR here ;(
printf("char was found\n"); 
} 

を私は得る:

error: cannot dynamic_cast '* list' (of type 'void*') to type 'class Foo*' (source is not a pointer to class) 
error: cannot dynamic_cast '* list' (of type 'void*') to type 'char*' (target is not pointer or reference to class) 

これはなぜでしょうか?私はここで間違っていますか? dynamic_castは私がここで使うべきものですか?事前に

おかげ

編集:私は上記のコードを知っている

がはるかに通常のCのようなもので、確実に視野のC++の点から吸うが、私は次のような状況を持っていると私は本当に前に何かをしようとしていました

長さnの配列が2つありますが、どちらの配列も同じインデックスにオブジェクトを持つことはありません。 したがって、array1 [i]!= NULLまたはarray2 [i]!= NULLがあります。これは明らかに記憶の浪費なので、長さnの単一の配列に両方の種類のオブジェクトを持つことができれば、すべてが解決されると考えました。

私はCocoa(Objective-C)NSArrayのようなものを探しています。入れたいオブジェクトの型を気にしないところです。他の方法を使うことができるので問題はありません。後で特定のクラスを取得する。 C++のようなものがありますか(好ましくは第三者のC++ライブラリではありません)?事前に

感謝;)

+0

のようなものを示唆していますか? C++は静的型付き言語であり、動的型付きオブジェクトを持つことによってどのような特徴を発明しようとしていますか?私たちがこれを知っていれば、より有用な答えを提供することができます。 –

答えて

2

この目的を達成するには、boost :: variantまたはboost :: anyを使用する必要があります。 dynamic_castは、ソースとターゲットの型が継承によってリンクされている場合にのみ機能します。また、void *を使うことは、圧倒的多数のコードではひどいひどいスタイルです。完全に安全ではありません。

実際には、コードを読んで、私はちょうどあなたがC + +の基本的な本を得ることをお勧めします。

EDIT:dynamic_castは、継承によってリンクされ、基本クラスに少なくとも1つの仮想関数があります。

+0

これは完全に実験であり、私はvoid *の非安全性を認識していますが、私は何かを試していましたが、今は悪い考えでした。 boost :: variantとboost :: anyに感謝します。 – nacho4d

1

のdynamic_castがvoidポインタでは動作しません。代わりにあなたのリストにタイプされたポインタを格納するか(例えば共通の基底クラスへのポインタ)、またはreinterpret_castを代わりに使う必要があります(変換が意味をなさない場合でもreinterpret_castが成功するため、非常に注意してください)

あなたがその種の何かをする前に
1

あなたのコードはC++にとってひどいですが、Cではこれらのことはかなり一般的です...あなたのプログラムでC++の機能を使用していない場合は、質問カテゴリをCに変更する必要がありますか?

あなたはそれがC-ようにしたい場合は、私はあなたが達成するために何をしようとしていること

enum type{ type1, type2, typeChar, typeFoo } 

struct ptr{ 
    void * p; 
    type t; 
}; 

ptr* list=new ptr[2]; 
list[0].p = &foo; 
list[0].t = typeFoo; 
list[1].p = not_table; 
list[1].t = typeChar; 

if (list[0].t == typeChar){ 
    printf("char was found\n"); 
} 
if (list[0].t == typeFoo){ 
    printf("Foo was found\n"); 
} 
関連する問題