取消引用一个void指针数组

时间:2012-03-13 18:50:58

标签: c++ pointers

假设我有一个指向不同类型对象的void指针数组,我想通过一个函数传递它们并将它们转换为各自类型的指针,我将如何进行此操作?我已经尝试过这个当前的代码,但是我收到了错误:

  

'void *'不是指向对象的指针类型

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允许将用户数据输入到TrackbarCallback中,当移动滑块时调用该轨迹,但只能以空指针的形式调用。

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

4 个答案:

答案 0 :(得分:7)

  

假设我有一个无效指针数组

void deference( void *data )

这不是一个void指针数组,它只是一个空指针。

将其更改为void **,然后因为您正在混合使用C和C ++样式,为什么不使用C样式转换? :

objectA *objA_ptr = (objectA *) data[0];

答案 1 :(得分:3)

  1. 从同一个基类派生所有人。

  2. 如果您的函数需要删除它们,则将析构函数设为虚拟。

  3. 制作阵列BaseClass *data[4]

  4. 制作您的函数void deference(BaseClass **data)

答案 2 :(得分:2)

您可以使用reinterpret_cast<>()代替static_cast<>

答案 3 :(得分:0)

正确的函数原型需要

void dereference(void **data)

因为你传递了一个void *数组,而且我们都知道在C和C ++中,在大多数情况下数组表达式会被指针表达式替换。

为什么必须使用指向不同类对象的指针数组?这闻起来像是C ++问题的C解决方案。

相关问题