将类指针转换为空指针

dom*_*lao 12 c++ casting

我怎样才能将类指针转换为像void*这样的通用指针?就像这段代码有效吗?

class CFoo
{
   int a;
public:
   CFoo():a(1){}
   ~CFoo(){}
   getNum(){return a;}
};

void tfunc(void* data)
{
    CFoo* foo = static_cast<CFoo*>(data);
    std::cout << "Number: " << foo->getNum();
    delete foo;
}

int main()
{
   CFoo* foo = new CFoo;
   void* dt = static_cast<void*>(foo);
   tfunc(dt); // or tfunc(static_cast<void*>(food));

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 11

这完全有效.以下是标准的说法:

§4.10指针转换

2类型为"指向cv的 指针"的rvalue T,其中T是一个对象类型,可以转换为"指向cv的 指针void" 类型的右值.一个"指针转换的结果CV T "发送给"指针CV void "指向其中类型的对象的存储位置的起始T驻留,因为如果对象是类的一个最派生对象(1.8) T(即,不是基类子对象).

这意味着您可以将指向class的指针转换为void指针.而......

§5.2.9静态施法

10"指向cv的 指针void" 类型的右值可以显式转换为指向对象类型的指针.转换为"指向cv的 指针void"并返回原始指针类型的对象的类型指针值将具有其原始值.

这意味着您可以使用static_cast将void指针转换回原始类指针.

希望能帮助到你.祝好运!


qua*_*ana 6

在C++中,您不需要静态强制转换来 void*:

int main()
{
    CFoo* foo = new CFoo;
    void* dt = foo;
    tfunc(dt); // or tfunc(foo);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:你的实现tfunc()是非常正确的,因为它确实需要强制转换.