2016-01-09 41 views
0

晚上好,我第一次在这里问一个问题,所以请让我知道是否有我犯的错误。检查创建的对象的类是否来自另一个类

我和我的朋友最近也开始编码了一个基于组件的游戏引擎,并跑进已经困扰我好几天的问题。 我有一个实体类,它存储了附加到它的组件列表,并且我已经能够通过模板成功地向组件添加和删除组件。下面示出的简化的代码:

class Component 
{ 
    type_index getType() { return std::type_index(typeid(*this)); } 

    template<class T> 
    bool Component::IsInheritedFrom(){ 
     return std::is_base_of<T, std::remove_pointer<decltype(this)>>::value; 
    } 

class Entity 
{ 
    std::vector<Component*> ComponentList; 

    template<class T> 
    T* getComponent(){ 
     //Just iterate through the vector list and use each component's getType function to check 
    } 

    template<class T> 
    T* removeComponent(){ 
     //Same as above 
    } 

    template<class T> 
    T* getBaseComponent(){ 
     //Iterate and use component's IsInheritedFrom function to check 
    } 
} 

的问题是,在开发游戏,我们创建了一些对撞机部件,以及一个colliderManager:

class ColliderComponent : public Component 
{ 
    void CheckCollision(Entity* toCheck) 
    { 
     //Unable to get component 
     auto comp = toCheck->getBaseComponent<ColliderComponent>(); 
    } 
} 

class SphericalColliderComponent : public ColliderComponent 
{} 

class AABBColliderComponent : public ColliderComponent 
{} 

对于具有球形或AABB的实体碰撞器,IsInheritedFrom函数不会按预期工作,因为继承的碰撞器作为Component *存储在向量列表中,因此,当调用IsheritedFrom函数时,decltype将(this)读作Component *而不是AABBColliderComponent *。

我知道,使用dynamic cast作品肯定的,但我真的不倾向于使用它,并希望一些铁杆的模板学习使用。现在我现在的解决方法是让每个组件类都有自己的类名作为字符串返回,并检查类名。

如果有人在正确的方向给我指针,真的很感激,谢谢!而且也想知道我是否应该将其发布到gamedev部门。

+0

*“那么,让我知道,如果我犯了什么错误”* - 是的,你还没有发布MCVE。你的代码不能被编译。使其可编译并将其降低到重现问题所需的最低限度。 –

回答

1

在运行时,您需要访问类型信息。

这意味着你需要一个RTTI系统。内置的一个通过动态的cast和typeid暴露出来。 Typeid不适合你的问题。

所以这意味着动态转换,或滚动你自己的RTTI系统。滚压自己

一种方法是保持你要查询所有类型的中央列表,然后使用模板和CRTP以用有关给定的对象是什么类型的信息的虚函数表。

另一个办法是一个完整的动态铸更换,其中每个类型给出了它和它的位置足够relected知识的分类来填充自己手写的RTTI查询系统。

这两者都是馊主意,因为它是相似的人谁不知道如何开车提议建立一个飞机去杂货店。

最后的方法是重新考虑你的设计。如果A是B并且与Bs一起存储,则基于是A而不是B的过滤是设计气味。考虑标签或脱离你的类级别的东西来代替类型查询。

+0

通常,OP所具有的类似问题已通过[能力查询](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Capability_Query)或[IUnknown/Query Interface](https:// en .wikipedia.org /维基/ IUnknown的)。 – StenSoft

相关问题