【问题标题】:Casting Type** to void* and then back to Type*将 Type** 转换为 void* 然后返回 Type*
【发布时间】:2014-08-24 07:09:10
【问题描述】:

我在投射方面遇到问题。

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 以便调用该方法?

【问题讨论】:

  • 嗯,A* 和 A** 是两个不同的东西。
  • const **A a 的语法真的有效吗?不应该是const A ** a吗?
  • @rattmuff:你会如何调用funcA的方法?
  • @unwind 应该,发布错误。
  • @pts 我不知道它是从我无法控制的系统中调用的。我只控制funcB。

标签: c++ casting


【解决方案1】:

两种可能:

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);
    [...]
}

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

还要注意,按照现在的编写方式,我们丢失了原始 a 上的 const 限定符。这可能是一件坏事。您可能希望改为在 funcB 中转换为 const A*。

【讨论】:

    【解决方案2】:

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

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

    funcB((void*) *a)
    

    您必须看到 A** a 参数的真实含义 - 内存中的值。这个值是一个地址,更具体地说是A* 的地址。所以如果你取消引用A**,你会得到一个A*。然后,您拥有的值又是一个地址,但属于 A 类型的对象本身。

    • A** 持有A* 的地址
    • A* 持有A 类型对象的地址

    【讨论】:

      【解决方案3】:

      问题是funcA 中的参数a 是A**,而不是A*。所以你以A** 开头并以A* 结尾,并且地址没有成员。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-24
        • 2020-07-05
        • 2020-12-27
        • 2013-11-03
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多