c++ - dynamic_cast 返回空指针

标签 c++ entity components dynamic-cast nullptr

为了好玩,我决定尝试制作一个简单的实体组件系统。我有一个包含所有组件的列表,我创建了一个名为 getPositionComponent 的函数,它获取实体 ID 并返回与该实体相关的位置组件。我制作的所有组件都派生自 Components 类。

struct Component
{
public:
    std::string readableName;
    Component::Component();
    Component(std::string name);
    virtual ~Component();
};

位置组件

 struct PositionComponent :
        public Component
    {
    public:
        PositionComponent(int x, int y);
        ~PositionComponent();
        int x, y;
    };

这是 getPositionComponent 的样子

PositionComponent* ComponentManager::getPositionComponent(int entityID) {
    int index = entitiesLookup_[entityID] + positionComponentsLookup_[entityID];

    Component *comp = &components_[index];
    PositionComponent* postionComponent = dynamic_cast<PositionComponent*>(comp);

    if (postionComponent != nullptr)
        return postionComponent;
    return nullptr;
}

当我运行它时,当我使用 dynamic_cast 时它总是返回一个 nullptr。在调试时我可以确认 Component *comp = &components_[index];返回正确的组件类型。

附带说明一下,我正在阅读一篇文章,其中针对 MMO,他们使用 SQL 来存储组件。在单人游戏中,sql 从游戏循环中的组件本地提取数据有多慢/多快?

最佳答案

我要大胆猜测一下......

您正在存储 Compoent 的列表s 在 std::vector<Component> .当您存储 Component 的派生类时在std::vector ,你失去了派生类部分。因此,dynamic_cast失败。

您可以通过存储指向 Components 的指针列表来解决该问题。在 `std::vector.

您可以通过确保基类是抽象基类来避免此类错误。

关于c++ - dynamic_cast 返回空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728698/

相关文章:

c++ - 使用 std::array 并使用 "array"作为名称

c++ - 结构化绑定(bind)违规

c++ - 如何重新连接到不响应 close() 的服务器

java - 如何将MaxHealth设置为自定义EntitySkeleton?

symfony - 实体中的Symfony/原则关系COUNT

java - 继承实体类的通用回调方法(@PostLoad..) - JPA EclipseLink

Angular 对话框 : No component factory found for DialogModule.

javascript - 你如何在 react 中调用另一个组件中的组件?

c++ - 如何使用 MPI 在不同的处理器上使用相同的数组

ajax - Wicket:滚动到底部时会附加更多项目的中继器组件?