2014-03-24 80 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

相关问题