取消引用一个空指针数组
Dereferencing an array of void 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] );
}
有人知道实现这一点的正确方法吗?
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];
-
从同一个基类派生它们。
-
如果函数需要删除析构函数,则将其设为虚拟析构函数。
-
使您的阵列
BaseClass *data[4]
-
使您的函数
void deference(BaseClass **data)
您可以使用reinterpret_cast<>()
而不是static_cast<>
。
正确的功能原型需要是
void dereference(void **data)
由于您正在传递一个void *
数组,而且我们都知道在C和C++中,在大多数情况下,数组表达式都会被指针表达式所取代。
为什么必须使用指向不同类对象的指针数组,有什么特别的原因吗?这听起来像是C++问题的C解决方案。
相关文章:
- 为什么我在C++中有一个空指针取消引用
- 为什么 C++11 包含一个关于比较空指针的奇怪子句
- opus_encoder_create() 返回一个空指针
- C++:另一个"检查指针是否为空"
- C++返回一个空指针数组
- 如果我得到一个空指针,该怎么办
- 从字符串数组打印其中一个字符串时出现空指针赋值错误
- Do C和C++标准意味着地址空间中必须只存在一个特殊值来表示空指针的值
- 如何正确地将一个文本整数作为参数作为空指针进行传递,并使用其地址作为整数的实际值
- 以何种形式,可以通过管道将空指针发送到不同进程地址空间中的另一个进程
- 取消引用一个空指针数组
- 从空指针中推导一个类型
- 将字符串转换为char指针将返回一个空字符串
- 在C++中删除一个空指针被认为是未定义的行为
- 释放一个空指针
- 为什么空指针解引用不是一个异常
- 是否空指针分配分区有一个错误
- 返回语句返回一个空指针值而不是期望的值
- 将空指针增加一个字节?2
- 从指向结构体的空指针到另一个变量的深度复制