gpt4 book ai didi

c++ - 将指针从基类型转换为子类型

转载 作者:可可西里 更新时间:2023-11-01 18:06:06 25 4
gpt4 key购买 nike

我正在为我的项目构建一个简单的游戏设计。我有以下类(class):

class Character
{
public:
virtual void Display();
virtual void SetParameters( char* param, ... );
};

class NonPlayableCharacter : public Character
{

public:
virtual void Display();
virtual void SetParameters( char* paaram, ... );
int GetNPCState();
}

然后我有一堆派生自 Character 或 NonPlayableCharacter 的类。我这样定义它:

std::vector<Character*> _allChar;

我的问题是在任何给定时间我都想对 vector 的一个元素执行一些操作。所以从 vector 中取出一个元素我不能直接调用方法 GetNPCState() 因为 vector 中的元素是 Character* 类型。所以这样做:

_allChar[0]->GetNPCState();

没用。所以我试着用著名的 dynamic_cast 来做:

NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
test->GetNPCState();

最后一次尝试的问题是 GetNPCState() 崩溃,因为对象为 null,而且我知道一个事实(通过调试)_allChar[0] 不为 null。

最佳答案

C++ 中有几种类型的转换(4),这里对其中 2 种感兴趣:

  • static_cast假设你知道自己在做什么
  • dynamic_cast在运行时检查您是否“猜对”了

注意:简化为 dynamic_cast还允许交叉转换和涉及虚拟基地的转换。

dynamic_cast有3个版本,真的,取决于目标的性质:

  • 如果目标是引用(即dynamic_cast<T&>(u)),那么如果检查失败dynamic_cast抛出 std::bad_cast异常
  • 如果目标是一个指针(即dynamic_cast<T*>(p)),那么如果检查失败dynamic_cast返回空指针
  • 最后,作为一个特例,如果目标是void* , 然后 dynamic_cast而是返回完整对象的地址

在这种情况下,您可以:

  • dynamic_cast<NonPlayableCharacter*>(_allChar[0])->getNPCState()切换至 dynamic_cast<NonPlayableCharacter&>(*_allChar[0]).getNPCState() , 让异常传播
  • 测试转换结果(此处为 NonPlayableCharacter* test)是否为无效

关于c++ - 将指针从基类型转换为子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13013373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com