簡體   English   中英

將類指針轉換為空指針

[英]Casting Class Pointer to Void Pointer

我怎樣才能將類指針轉換為像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.10指針轉換

2類型為“指向cv 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指針轉換回原始類指針。

希望能幫助到你。 祝好運!

在C ++中,你不需要靜態投 void*

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

    return 0;
}

注意:你的tfunc()實現非常正確,因為它確實需要tfunc()

這有效嗎?

是的,它符合標准§5.2.9.7

類型為“指向cv1 void的指針”的prvalue可以轉換為類型為“指向cv2 T的指針”的prvalue,其中T是對象類型,cv2與cv1具有相同的cv資格,或者更高的cv資格。 空指針值將轉換為目標類型的空指針值。 指向對象的類型指針的值轉換為“指向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.
    CFoo* foo = new CFoo;
    void* dt = (void*)foo;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM