以下是 PhysX 示例中的一些代碼:
std::vector<PxRigidActor*> actors(nbActors);
scene->getActors(PxActorTypeFlag::eRIGID_DYNAMIC | PxActorTypeFlag::eRIGID_STATIC,
reinterpret_cast<PxActor**>(&actors[0]), nbActors);
然后在getActors函式的代碼中,他們像這樣使用它:
PxU32 NpScene::getActors(PxActorTypeFlags types, PxActor** buffer, PxU32 bufferSize, PxU32 startIndex=0) const
{
...
if ((types & PxActorTypeFlag::eRIGID_STATIC ) && mRigidActors[i]->is<PxRigidStatic>())
{
if (virtualIndex >= startIndex)
buffer[writeCount ] = mRigidActors[i];
virtualIndex ;
}
else if ((types & PxActorTypeFlag::eRIGID_DYNAMIC) && mRigidActors[i]->is<PxRigidDynamic>())
{
if (virtualIndex >= startIndex)
buffer[writeCount ] = mRigidActors[i];
virtualIndex ;
}
...
}
mRigidActors 被定義為 Ps::Array<PxRigidActor*>
繼承圖如下所示:

所以,我的問題是:
聽說指向父類的指標可以指向子類的實體。那么,為什么我們需要任何鑄造呢?我試過了,但沒有鑄造它不起作用。
在這里使用 reinterpret_cast 是否安全?(我想是的,因為它只是指標轉換)
有更好的解決方案嗎?
uj5u.com熱心網友回復:
聽說指向父類的指標可以指向子類的實體。那么,為什么我們需要任何鑄造呢?我試過了,但沒有鑄造它不起作用。
有一個從PxRigidActor*to的隱式轉換PxActor*(派生到基類的指標轉換),但是PxRigidActor**和之間沒有這種關系PxActor**
在這里使用 reinterpret_cast 是否安全?(我想是的,因為它只是指標轉換)
強制轉換本身并不是不安全的,但取消參考由強制轉換創建的指標是未定義的行為。
有更好的解決方案嗎?
首先定義actors一個合適的型別,即
std::vector<PxActor*> actors(nbActors);
scene->getActors(PxActorTypeFlag::eRIGID_DYNAMIC | PxActorTypeFlag::eRIGID_STATIC, actors.data(), nbActors);
然后您可以根據需要添加static_cast<PxRigidActor*>元素actors。
uj5u.com熱心網友回復:
reinterpret_cast<PxActor**>(&actors[0])
正在轉換向量的第一個元素的地址,而不是轉換元素本身。
此外,被呼叫的函式將指標視為陣列。也就是說,它將.data()向量的 轉換為不同型別的元素。
您希望static_cast在基類/派生類參考或指標之間導航時使用。但這突出了一個問題:如果基類實體不在派生類的開頭,則強制轉換可能會修改地址!在reinterpet_cast避免了這一點,只是改變了型別不改變的價值......但如果這樣的數值變化是必要的,這個代碼將無法正確作業,無論如何。通過強制轉換“out”引數的地址而不是該地址中的值,代碼不知道該插槽中存盤的任何內容都需要調整回真實型別。
由于他正在投射一個指向該指標的指標,因此static_cast不能直接在同一個地方作業。它是一個雙指標,不遵循D*to規則B*。它必須將 thestatic_cast
作為參考強制轉換,然后獲取that的地址。在我的頭頂上,像&static_cast<PxActor*&>(actors.data())(可能有同樣的問題;我必須敲打它才能使某些東西起作用,可能不是一個單一的表達;我無意嘗試這樣做。)
我的猜測是他將傳統 C 型演員轉換為reinterpet_cast并沒有考慮太多,或者看到只有這個有效(與傳統演員在同一個地方)。
但為什么?
該代碼填充基類指標的連續集合。它接受一個out引數而不是回傳 a vector,并且呼叫者希望將該向量定義為派生型別而不是基型別。通常將其保留為基類應該沒問題,因為該行為可能是多型的。
這是從不同的源集合復制,在每個分支中使用相同的代碼。它可能應該是通用的,或者使用訪問者模式。這將避免大多數型別轉換問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/326515.html
上一篇:Nestjs覆寫基本服務方法
