将类指针转换为空指针

时间:2013-09-21 05:22:44

标签: 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;
}

4 个答案:

答案 0 :(得分:11)

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

  

§4.10指针转换

     
    

2类型为“指向 cv T的指针的右值”,其中T是一个对象         type,可以转换为“指向 cv 的指针”的右值         void。“将指向 cv T”的指针转换为“指针”         到 cv void“指向存储位置的开头         类型为T的对象驻留,就好像该对象是派​​生最多的对象         类型T的对象(1.8)(即,不是基类子对象)。

  

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

  

§5.2.9静态演员

     
    

10可以明确指出“指向 cv void的指针”的右值         转换为指向对象类型的指针。类型指针的值         将对象转换为“指向 cv void的指针”并返回到         原始指针类型将具有其原始值。

  

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

希望它有所帮助。祝你好运!

答案 1 :(得分:6)

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

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

    return 0;
}

注意:tfunc()的实施非常正确,因为 需要演员。

答案 2 :(得分:1)

  

这有效吗?

是的,它符合标准§5.2.9.7

  

类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue,其中T是对象类型,cv2与cv-qualification相同,或者cv-qualification等于,cv1。空指针值将转换为目标类型的空指针值。 指向对象的类型指针的值转换为“指向cv void的指针”并返回,可能具有不同的cv-qualification,应具有其原始值。 [示例:

T* p1 = new T;
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
bool b = p1 == p2; // b will have the value true.

答案 3 :(得分:0)

    CFoo* foo = new CFoo;
    void* dt = (void*)foo;