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

用户3836339

首先,我真的很抱歉标题,但我不知道如何正确表达我的问题。无论如何,我正在使用 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:懒得显式转换组件。是否可以通过其他两种方式访问​​组件?

阿尔瓦罗·马特奥

您可以像这样在 Entity 中定义模板函数:

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

并像提到的@ Jarod42 那样称呼它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在派生类型中使用返回基类型对象的基类型方法?

在不指定派生类的情况下声明对象

如何在不强制转换或复制签名的情况下使基类模板函数对派生类实例可见?

如何在没有类型问题的情况下在派生类上强制执行对象字段或属性?

我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

如何在没有dynamic_cast的情况下对派生类型实现“较少”?

从基类方法返回派生类型

如何在不指定模板类型的情况下声明通用抽象类的对象

在基类和派生类上进行操作时,如何返回派生类型?

返回派生类类型的基类中的方法?

使用auto从基类与派生类的返回类型冲突

基类方法可以返回派生类的类型吗?

在派生类中更改基类方法的返回类型

将派生类映射到基类时,ModelMapper 返回源对象类型

从基类和派生类之外的方法返回任何派生类类型

如何在不创建新对象的情况下返回对象类?

返回派生类型的基类中的C#方法

如何设计具有不同返回类型的基类和派生类?

将派生类强制转换回基类

如何在<基本类型>的列表中查找并返回<派生类型>的对象?

如何从基类获取派生类类型

如何返回派生类型?

如何在不使用getter的情况下访问派生类的静态成员?

如何在没有CWinApp派生类的情况下实现MFC序列化?

如何在不注释类型的情况下添加数据类字段?

如何在不命名类/类型的情况下动态解析方法 getter 及其值

如何在不创建实例的情况下获取类的方法成员的类型?

如何在不事先知道类型的情况下动态构造Scala类?

如何在不指定类的情况下使用显式类型参数调用Java方法?