无法修改来自vector <shared_ptr <Base >>

时间:2019-06-15 10:26:39

标签: c++ pointers

标题描述了情况,但潜在的问题可能完全不同。

我正在尝试制作一个简单的ECS游戏引擎。我有一堆实体,每个实体都包含一个vector<shared_ptr<Component>>Component是所有派生组件的基类。

在游戏循环中,我有不同的System用来更新具有某些组件的实体。我为系统获取正确组件的方法是使用以下功能

        template <typename T> 
        inline T& GetComponent(std::uint32_t type)
        {
            std::shared_ptr<Component> baseComponent = this->components[this->typeToIndexMap[type]];
            std::shared_ptr<T> component = std::static_pointer_cast<T>(baseComponent);
            return *(component.get());
        }

问题是,当我尝试修改系统(inputComponent.lastX = 5.f;)中的组件时,它不起作用。下一个帧的值是相同的。我猜测发生某种中断是因为我正在存储Component,但不确定如何解决此问题。有什么想法是真的,我该如何解决?

编辑:其他信息

实体将组件保存在vector<shared_ptr<Component>>

添加组件

void Entity::AddComponent(std::shared_ptr<Component> component)
{
    this->components.push_back(component);
    this->componentBitset = this->componentBitset | component->GetComponentType();
    this->typeToIndexMap[component->GetComponentType()] = this->components.size() - 1;
}

组件创建

std::shared_ptr<InputComponent> inputComponent = std::make_shared<InputComponent>(InputComponent());
entity->AddComponent(inputComponent);

组件结构

class Component
{
public:
    // Constructor / Destructor
    Component(std::uint32_t type);
    ~Component();
    std::uint32_t GetComponentType();

private:
    std::uint32_t type;
};

输入组件

class InputComponent : public Component
{
    public:
        InputComponent();
        ~InputComponent();

        double lastX;
        double lastY;
};

最后我们有了系统

void InputSystem::Update(GLFWwindow* window, std::vector<std::shared_ptr<Entity>>& entities)
{
    for (int i = 0; i < entities.size(); i++)
    {
        if (entities[i]->IsEligibleForSystem(this->primaryBitset))
        {
            InputComponent component = entities[i]->GetComponent<InputComponent>(ComponentType::Input);
            double x, y;
            glfwGetCursorPos(window, &x, &y);
            // some other things are happening here
            component.lastX = x;
            component.lastY = y;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题在这里:

InputComponent component = entities[i]->GetComponent<InputComponent>(ComponentType::Input);

您实际上是按值获得了InputComponent。尝试更改GetComponent,使其返回T*,在此提到的第一行更改为:

InputComponent *component = entities[i]->GetComponent<InputComponent>(ComponentType::Input);