dynamic_cast返回空指针

时间:2014-05-19 01:51:56

标签: 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。在debbuging我可以确认Component * comp =&amp; components_ [index];返回正确的组件类型。

另一方面,我正在阅读一篇文章,其中对于MMO,他们使用SQL来存储组件。在单人游戏中,sql从游戏循环中的组件本地提取数据的速度有多慢?

1 个答案:

答案 0 :(得分:2)

我打算在这里猜测......

您正在Compoent中存储std::vector<Component>的列表。在Component中存储std::vector的派生类时,会丢失派生类部分。因此,dynamic_cast失败。

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

通过确保基类是抽象基类,可以避免这样的错误。