如何从接口中获取派生的 class?
How do I get the derived class from a interface?
在尝试用 C++ 创建实体组件系统时,我遇到了一些关于缺乏语言知识的问题。
使用 class Entity,它包含接口 IComponent(它更像是一个标志 "I hold data"),我有一个方法 Add,如果其中没有相同 class 的另一个 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 的基 class 并检查它们是否重复。
我怎样才能得到它们?如果 Foo 在 IComponent 列表中,我如何将 IComponent 转换为 Foo?
结帐dynamic_cast。您可以尝试将指向基 class 的指针强制转换为指向派生 class 的指针。如果实例化对象不是派生类型,则失败,在本例中 returns null。
如所述,我的解决方案是
template<typename T>
bool HasComponent(){
for(Component* component: this->components)
if(T* casted = dynamic_cast<T*>(component))
return true;
return false;
}
稍后只需检查 "HasComponent()" 是否为假,然后添加
在尝试用 C++ 创建实体组件系统时,我遇到了一些关于缺乏语言知识的问题。
使用 class Entity,它包含接口 IComponent(它更像是一个标志 "I hold data"),我有一个方法 Add,如果其中没有相同 class 的另一个 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 的基 class 并检查它们是否重复。
我怎样才能得到它们?如果 Foo 在 IComponent 列表中,我如何将 IComponent 转换为 Foo?
结帐dynamic_cast。您可以尝试将指向基 class 的指针强制转换为指向派生 class 的指针。如果实例化对象不是派生类型,则失败,在本例中 returns null。
如
template<typename T>
bool HasComponent(){
for(Component* component: this->components)
if(T* casted = dynamic_cast<T*>(component))
return true;
return false;
}
稍后只需检查 "HasComponent()" 是否为假,然后添加