如何从接口获取派生类?

时间:2019-06-24 02:23:41

标签: c++ reflection interface entity-component-system

在尝试用C ++创建实体组件系统时,由于缺乏语言知识,我遇到了一些问题。

对于具有实体类的类,该类具有接口 IComponent (其作用更类似于表示“我保留数据”的标志),我有一个方法添加,如果其中没有相同类的另一个IComponent,则将其添加到实体。

这是一个过于简化的示例代码:

struct IComponent{};

struct Foo : IComponent{ int x;};
struct Bar : IComponent{ int y; };

class Entity{
    vector<IComponent*> entityComponents;

    void Add(IComponent* componentToAdd){
        if("entityComponents" does not contain the class of "componentToAdd")
            entityComponents.add (componentToAdd)

    }
}

我的预期结果是

Entity e;
Foo f;
Bar b;
Foo anotherF;

e.Add(f); // Works
e.Add(b); // Works
e.Add(anotherF); // Does not work because another 
                 //item in the array already inherits Foo

但是我不知道如何从IComponents列表中获取Foo和Bar的基类,并检查它们是否重复。

我如何获得它们?如果Foo在IComponent列表中,如何将IComponent投射到Foo?

2 个答案:

答案 0 :(得分:1)

结帐dynamic_cast。您可以尝试将指向基类的指针转换为指向派生类的指针。如果实例化的对象不是派生类型,则失败,在这种情况下返回null。

答案 1 :(得分:1)

正如Bar Stool所述,我的解决方案是

template<typename T>
bool HasComponent(){
  for(Component* component: this->components)
        if(T* casted = dynamic_cast<T*>(component))
                return true;           
  return false;

}

然后只需检查“ HasComponent()”是否为假,然后将其添加