将类型**转换为void *然后返回Type *

时间:2014-07-03 08:43:03

标签: c++ casting

我遇到了投射问题。

A类有一个公共方法:char* m()

funcA接收一个指向A类型的双指针并将其强制转换为void指针。在funcB中,我希望将它转换回类型A,我可以调用方法m()。我已经尝试了以下但是失败了。

void funcA(const A** a) {
    funcB((void*)a)
}

void funcB(void* b) {
    A* a = (A*) b; // 
    printf("M: %s", a->m()); // => crash!
}

如何将void指针强制转换回类型A,以便我可以调用方法?

3 个答案:

答案 0 :(得分:3)

两种可能性:

void funcA(const A** a) {
    funcB((void*)*a);   // passing an A* to funcB
}

void funcB(void* b) {
    A* a = (A*) b;
    [...]
}

void funcA(const A** a) {
    funcB((void*)a);    // passing an A** to funcB
}

void funcB(void* b) {
    A* a = *(A**)(b);
    [...]
}

请注意我们在b中用于投射funcB的类型必须与我们从funcA传入的类型相匹配。这很容易出错,因为我们在转换为void*后会丢弃所有类型信息,因此编译器无法帮助我们。

另请注意,现在写入的方式,我们会丢失原始const上的a限定符。这可能是一件坏事。您可能希望转而使用const A*中的funcB

答案 1 :(得分:3)

Type**是指向Type*的指针,而Type*是指向Type类型对象的指针。

因此,如果我们假设funcA获得指向A类型对象的指针的有效指针,则必须首先使用*运算符取消引用它。

funcB((void*) *a)

您必须看到A** a参数,就像它实际上一样 - 内存中的值。此值是一个地址,更具体地说是A*的地址。因此,如果您取消引用A**,则会获得A*。您拥有的值又是一个地址,但是A本身的对象。

  • A**拥有A*
  • 的地址
  • A*包含A
  • 类型对象的地址

答案 2 :(得分:1)

问题是a中的参数funcAA**,而不是A*。因此,您从A**开始,以A*结束,地址没有成员。