[英]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
是對象類型,可以轉換為“指向cvvoid
指針”類型的右值。 一“指向cv轉換的結果T
”發送“指向cvvoid
”指向其中類型的對象的存儲位置的起始T
駐留,因為如果對象是類的一個最派生對象(1.8)T
(即,不是基類子對象)。
這意味着您可以將指向class的指針轉換為void指針。 而......
§5.2.9靜態施法
10“指向cv
void
指針”類型的右值可以顯式轉換為指向對象類型的指針。 轉換為“指向cvvoid
指針”並返回原始指針類型的對象的類型指針值將具有其原始值。
這意味着您可以使用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.