取消引用一个空指针数组

Dereferencing an array of void pointers

本文关键字:一个 空指针 数组 引用 取消      更新时间:2023-10-16

假设我有一个指向不同类型对象的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] ); 
}

有人知道实现这一点的正确方法吗?

edit:在上下文中,我使用opencv并尝试创建一个带有轨迹栏的简单gui界面。Opencv允许将用户数据输入TrackbarCallback,当滑块移动时会调用该回调,但只能以空指针的形式。

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

假设我有一个空指针数组

void deference( void *data )

这不是一个空指针数组,而是一个单独的空指针。

将其更改为void **,既然您无论如何都在混合C和C++样式,为什么不使用C样式转换呢?:

objectA *objA_ptr = (objectA *) data[0];
  1. 从同一个基类派生它们。

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

  3. 使您的阵列BaseClass *data[4]

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

您可以使用reinterpret_cast<>()而不是static_cast<>

正确的功能原型需要是

void dereference(void **data)

由于您正在传递一个void *数组,而且我们都知道在C和C++中,在大多数情况下,数组表达式都会被指针表达式所取代。

为什么必须使用指向不同类对象的指针数组,有什么特别的原因吗?这听起来像是C++问题的C解决方案。