我目前正在使用虚幻引擎4,看起来我无法避免一些演员。检查A是否是B的子类?
AController* c = this->GetController();
APlayerController* p = (APlayerController*)c;
有没有办法,我可以检查是否c
的方式是PlayerController
我做演员之前?
我目前正在使用虚幻引擎4,看起来我无法避免一些演员。检查A是否是B的子类?
AController* c = this->GetController();
APlayerController* p = (APlayerController*)c;
有没有办法,我可以检查是否c
的方式是PlayerController
我做演员之前?
与许多游戏引擎一样,虚幻引擎由于性能原因编译时没有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
。
如果类至少有一个虚函数(可能),你可以使用dynamic_cast
:
APlayerController* p = dynamic_cast<APlayerController*>(c);
这将返回一个空指针c
实际上不是正确的类型在运行时。
编辑除了至少有一个虚拟函数外,dynamic_cast
还需要在构建中启用运行时类型信息(RTTI)。它通常是语言的一部分,但编译器可以支持关闭它。
当我这样做时,我收到警告。 '警告C4541:'dynamic_cast'用于具有/ GR-的多态类型'AController';不可预知的行为可能会导致' –
@MaikKlein:这是因为您关闭了运行时类型标识,这是'dynamic_cast'工作所需的功能〜[MSDN参考](http://msdn.microsoft.com/zh-cn/我们/库/ we6hfdy0.aspx)。 – legends2k
转换方式倾向于工作是“尝试它,它工作吗?”。正如Angews回答说的那样,一个'dynamic_cast'将是你最好的选择,然后检查'nullptr'。 – OMGtechy