【问题标题】:Check if A is a subclass of B?检查A是否是B的子类?
【发布时间】:2014-05-01 19:54:21
【问题描述】:

我目前使用的是虚幻引擎 4,似乎无法避免一些强制转换。

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

有没有办法在我进行演员表之前检查c 是否是PlayerController

【问题讨论】:

  • 演员的工作方式往往是“试一试,有效果吗?”。正如 Angews 的回答所说,dynamic_cast 是您最好的选择,然后检查 nullptr

标签: c++ unreal-engine4


【解决方案1】:

与许多游戏引擎一样,出于性能原因,虚幻引擎在编译时没有使用 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 并在返回 null 时抛出一个断言;在发布版本中,它解析为快速的static_cast

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2013-04-01
    • 2013-09-10
    相关资源
    最近更新 更多