如何在不转换回基类类型的情况下返回其派生类型中的对象?

时间:2017-05-11 12:06:39

标签: c++ polymorphism type-conversion components

首先,我对标题感到非常抱歉,但我不知道如何恰当地表达我的问题。无论如何,我正在搞乱C ++和Allegro 5创建相同的游戏,只是使用更复杂的练习技巧。现在我正在尝试使用实体和组件,但我遇到了麻烦。

this->entity = new Entity();

this->entity->addComponent(new ComponentTest());

// How I currently access components

ComponentTest *c = (ComponentTest*)this->entity->getComponent("test");
c->setVariable(10);

// This would be cool

this->entity->getComponent("test")->setVariable(10);

// This would be completely rad

this->entity["test"]->setVariable(10);

问题是Entity :: getComponent返回一个指向Component的指针,所以我必须将它显式地转换回ComponentTest才能使用它的方法ComponentTest :: setVariable。

如果有一些方法可以使用我提到的另外两种方式进行访问,我只是在徘徊。我也对某些方法提出了改变代码的建议,以便更容易地访问实体的组件。

tl; dr:太懒了显式转换组件。是否可以通过其他两种方式访问​​组件?

1 个答案:

答案 0 :(得分:0)

您可以在实体中定义模板函数,如下所示:

    template<typename T>
    T* getComponent(const std::string &componentName)
    {
        Component *component = getComponent(componentName);
        return dynamic_cast<T*>(component);
    }

并称之为@ Jarod42提及。