我對C++相當陌生,但已經與C#合作了多年,但它並沒有幫助我。 :)在C++中鑄造派生類型問題
我的問題:我有一個Actor
類Ball
和Peg
都來自我正在從事的Objective-C iphone遊戲。在測試碰撞時,我希望根據actorA
或actorB
的實際運行時類型適當設置Ball
和Peg
的實例。我的代碼,測試此如下:
// Actors that collided
Actor *actorA = (Actor*) bodyA->GetUserData();
Actor *actorB = (Actor*) bodyB->GetUserData();
Ball* ball;
Peg* peg;
if (static_cast<Ball*> (actorA)) { // true
ball = static_cast<Ball*> (actorA);
}
else if (static_cast<Ball*> (actorB)) {
ball = static_cast<Ball*> (actorB);
}
if (static_cast<Peg*> (actorA)) { // also true?!
peg = static_cast<Peg*> (actorA);
}
else if (static_cast<Peg*> (actorB)) {
peg = static_cast<Peg*> (actorB);
}
if (peg != NULL) {
[peg hitByBall];
}
一旦ball
和peg
被設置,然後我繼續運行hitByBall
方法(目標C)。
我的問題真的在於鑄造程序中,Ball
從actorA
中投下了罰款;第一個if (static_cast<>)
語句適當地介入並設置ball
指針。
第二步是將相應的類型分配給peg
。我知道peg
應該是一個Peg
類型,我以前知道它會是actorB
,但是在運行時,檢測類型,我很驚訝地發現實際上第三個if (static_cast<>)
聲明介入並設置此,如果聲明是檢查actorA
是一個Peg
,我們已經知道actorA
是Ball
!爲什麼它會在這裏而不是在第四個if
聲明?
我可以承擔的唯一的事情是如何鑄造從C#的工作方式不同,那就是它發現actorA
這實際上是Ball
類型從Actor
派生,那麼它的時候發現static_cast<Peg*> (actorA)
執行它發現Peg
從Actor
派生太多,所以這是一個有效的測試?這可能都歸結爲我誤解了static_cast
的使用。我怎樣才能達到我需要的? :)
我真的很擔心我的感覺像一個漫長的蠻力鑄造嘗試在這裏與一噸荒謬的if
聲明。我敢肯定,有一種更簡單的方法可以實現簡單的轉換爲Peg
,並根據actorA
和actorB
中保存的實際類型轉換爲Ball
。
希望有人能幫助! :) 非常感謝。
什麼是GetUserData的返回類型() ? – Marlon 2010-05-22 04:20:49
這將是一個'球'或'釘'。它可以改變。 – GONeale 2010-05-22 04:37:36
'static_cast'不能像那樣工作。您錯誤地將'static_cast'作爲'dynamic_cast'。 – sellibitze 2010-05-22 07:13:21