2014-03-24 82 views
7

我目前正在使用虛幻引擎4,看起來我無法避免一些演員。檢查A是否是B的子類?

AController* c = this->GetController(); 
APlayerController* p = (APlayerController*)c; 

有沒有辦法,我可以檢查是否c的方式是PlayerController我做演員之前?

+0

轉換方式傾向於工作是「嘗試它,它工作嗎?」。正如Angews回答說的那樣,一個'dynamic_cast'將是你最好的選擇,然後檢查'nullptr'。 – OMGtechy

回答

5

與許多遊戲引擎一樣,虛幻引擎由於性能原因編譯時沒有RTTI,因此dynamic_cast將無法​​正常工作。虛幻引擎提供了自己的替代品,簡稱Cast。我現在找不到任何文檔,但this question描述了它的使用很好。

AController* c = this->GetController(); 
APlayerController* p = Cast<APlayerController>(c); 
if (p) { 
    ... 
} 

AController也有一個方便的方法CastToPlayerController將做同樣的事情:

AController* c = this->GetController(); 
APlayerController* p = c->CastToPlayerController(); 
if (p) { 
    ... 
} 

如果您確信c始終將是一個APlayerController然後CastChecked更有效:

AController* c = this->GetController(); 
APlayerController* p = CastChecked<APlayerController>(c); 
... 

在調試版本中,這將使用Cast,並且如果它發生了斷言d返回null;在發佈版本中,它解析爲快速static_cast

7

如果類至少有一個虛函數(可能),你可以使用dynamic_cast

APlayerController* p = dynamic_cast<APlayerController*>(c); 

這將返回一個空指針c實際上不是正確的類型在運行時。

編輯除了至少有一個虛擬函數外,dynamic_cast還需要在構建中啓用運行時類型信息(RTTI)。它通常是語言的一部分,但編譯器可以支持關閉它。

+0

當我這樣做時,我收到警告。 '警告C4541:'dynamic_cast'用於具有/ GR-的多態類型'AController';不可預知的行爲可能會導致' –

+1

@MaikKlein:這是因爲您關閉了運行時類型標識,這是'dynamic_cast'工作所需的功能〜[MSDN參考](http://msdn.microsoft.com/zh-cn/我們/庫/ we6hfdy0.aspx)。 – legends2k

相關問題