我正在为游戏制作引擎,我似乎无法解决以下问题。
所以,我有一个基本的组件类,从中派生出所有不同的组件。 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>();
或者其中的某些内容。
为简单起见,保证向量保证包含我们正在寻找的组件,并且没有相同类型的组件。
由于向量中的指针是基本组件类型,我如何检查它们最初是否是所请求的类型?提前谢谢!
答案 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
。