【问题标题】:Dereferencing an array of void pointers取消引用 void 指针数组
【发布时间】:2012-03-13 18:50:58
【问题描述】:

假设我有一个指向不同类型对象的 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 中,该方法在滑块移动时被调用,但只能以 void 指针的形式。

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

【问题讨论】:

  • 我的问题是;你到底为什么要使用void*?这是 C++,你有模板。

标签: c++ pointers


【解决方案1】:

假设我有一个空指针数组

void deference( void *data )

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

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

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

【讨论】:

    【解决方案2】:
    1. 从同一个基类派生它们。

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

    3. 制作你的数组BaseClass *data[4]

    4. 让你的函数void deference(BaseClass **data)

    【讨论】:

    • 或者,使用vector&lt;BaseClass*&gt; 代替数组。
    • @JohnBode ...并使用 shared_ptr 而不是将“普通”指针放入向量中
    【解决方案3】:

    您可以使用reinterpret_cast&lt;&gt;() 代替static_cast&lt;&gt;

    【讨论】:

    • 如果 static_cast 不起作用,那么显然 reinterpret_cast 只能在这里更错误?
    • 这取决于您对“不起作用”的含义。 reinterpret_cast 它是最强大也是最危险的演员阵容。它的工作原理是它放弃所有编译器类型检查并确保“我知道我要求什么 - 去做!”。
    • 这很好,因为void* 编译器没有信息可以执行任何类型检查。
    【解决方案4】:

    正确的函数原型需要是

    void dereference(void **data)
    

    因为您传递的是void * 的数组,并且众所周知,在 C 和 C++ 中,数组表达式在大多数情况下会被指针表达式替换。

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

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多