2012-03-13 15 views
1

私は、さまざまな型のオブジェクトを指すvoidポインターの配列を持っていて、それらを関数に渡してそれぞれの型のポインターにキャストしたいとします。私は、この現在のコードを試してみたが、私はエラーを取得:voidポインタの配列を逆参照する

‘void*’ is not a pointer-to-object type

objectA myObjectA; 
objectB myObjectB; 
objectC myObjectC; 
objectD myObjectD; 

void *data[4]; 

data[0] = static_cast<void *>(&myObjectA); 
data[1] = static_cast<void *>(&myObjectB); 
data[2] = static_cast<void *>(&myObjectC); 
data[3] = static_cast<void *>(&myObjectD); 

void dereference(void *data) 
{ 
    objectA *objA_ptr = static_cast<objectA *>(data[0]); 
    objectB *objB_ptr = static_cast<objectB *>(data[1]); 
    objectC *objC_ptr = static_cast<objectC *>(data[2]); 
    objectD *objD_ptr = static_cast<objectD *>(data[3]); 
} 

誰もがこれを実装する正しい方法を知っていますか?

編集:コンテキストのために、私はopencvを使用していて、トラックバーで簡単なGUIインターフェイスを作成しようとしています。 Opencvでは、スライダが移動されたときに呼び出されるが、voidポインタの形でのみ呼び出されるTrackbarCallbackにユーザデータを入力することができます。空ポインタの配列ではありません

int createTrackbar(const string& trackbarname, const string& winname, 
          int* value, int count, 
          TrackbarCallback onChange=0, 
          void* userdata=0); 
+3

私の質問は、なぜあなたは 'void * 'をまったく使っていますか?これはC++で、テンプレートがあります。 –

答えて

7

Say I have an array of void pointer

void deference(void *data) 

、それは単一のvoidポインタです。

void **に変更してください。とにかくCとC++のスタイルを混ぜているので、Cスタイルのキャストを使用しないのはなぜですか? :

objectA *objA_ptr = (objectA *) data[0]; 
3
  1. は、同じ基本クラスからそれらすべてを導出します。

  2. あなたの関数がそれらを削除する必要がある場合、デストラクタを仮想にします。

  3. はあなたの配列BaseClass *data[4]

  4. があなたの代わりにstatic_cast<>reinterpret_cast<>()を使用することができ、あなたの関数void deference(BaseClass **data)

+0

代わりに、配列の代わりに ''を使用してください。 –

+0

@ JohnBode ... vectorに "plain"ポインタを入れる代わりにshared_ptrを使用する –

2

を行います。

+0

static_castが機能しない場合は、明らかにreinterpret_castだけがここで間違っている可能性がありますか? – UncleBens

+0

「うまくいかない」とは何を意味するかによって異なります。 reinterpret_cast<>それは最も強大で最も危険なキャストです。それは、すべてのコンパイラ型チェックをスローダウンし、「私が求めていることを知っています - それを実行する」という意味で機能します。 – Matthias

+0

これは良いことです。なぜなら 'void *'コンパイラはタイプチェックを行うための情報がないからです。 –

0

あなたがvoid *の配列を渡している、と我々はすべてのCおよびCに知っているように++配列式は、ほとんどの状況で、ポインタの表現に置き換えているので、正しい関数プロトタイプは

void dereference(void **data) 

する必要があります。

異なるクラスのオブジェクトへのポインタの配列を使用する必要がある特別な理由はありますか?これはC++の問題に対するCの解決策のようなものです。