比较派生类之间的类型

时间:2014-05-03 12:00:55

标签: c++ pointers polymorphism downcast

我正在为游戏制作引擎,我似乎无法解决以下问题。

所以,我有一个基本的组件类,从中派生出所有不同的组件。 GameObject基本上是不同组件的容器。组件存储在包含指向基本组件类的指针的向量中。现在我需要GameObject类有一个getComponent成员函数模板,它将从向量中返回具有所请求类型的组件。

更清楚:

class Component 
{
        /..../
};

class RigidBody : Component
{
        /..../
};

class Animation : Component
{
        /..../
};

class GameObject
{
public:
        template <class T>
        T* getComponent();

        void addComponent(Component*);
private:
        std::vector<Component*> m_components;
};

/...../

GameObject test;
test.AddComponent(new RigidBody());
test.AddComponent(new Animation());
Animation * animation = test.getComponent<Animation>();

或者其中的某些内容。

为简单起见,保证向量保证包含我们正在寻找的组件,并且没有相同类型的组件。

由于向量中的指针是基本组件类型,我如何检查它们最初是否是所请求的类型?提前谢谢!

1 个答案:

答案 0 :(得分:1)

假设Component至少有一个虚函数(否则从它继承的是什么,对吧?)你应该能够使用运行时类型信息(RTTI)和{{1}来做你需要的事情。 },像这样:

dynamic_cast

回想一下,template <class T> T* getFirstComponent() { for (int i = 0 ; i != m_components.size() ; i++) { T *candidate = dynamic_cast<T*>(m_components[i]); if (candidate) { return candidate; } } return nullptr; } 仅在演员表成功时返回非空值。上面的代码遍历所有指针,并选择dynamic_cast<T*>成功的第一个。

重要提示:虽然这应该可以帮助您的程序按照自己的意愿行事,但请考虑更改设计:而不是按类型提取对象,为它们提供可让您使用的虚拟功能他们都是统一的。将不同类的对象放入一个容器中是没有意义的,只是稍后将它们分开。 RTTI应该作为最后的手段,而不是主流工具,因为它会使您的程序更难理解。

另一种有效的方法是单独存储各个组件,而不是单个矢量,只有在需要统一处理对象时才能获取向量。

不太重要的注意事项:如果dynamic_cast<T*>无法在您的系统上进行编译,请替换为nullptr