在尝试用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?
答案 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()”是否为假,然后将其添加