【发布时间】:2019-05-08 03:33:18
【问题描述】:
我正在尝试编写 Unity 风格的 get 组件方法。到目前为止,这是我的代码。它会编译,但会返回它找到的第一个组件,而不是正确的组件。我想我使用 static_cast 错误。有什么更好的方法来做到这一点?注意我不想硬编码组件类型,我希望能够编译这个引擎并使用从 Component 继承的任何东西来使用这个系统。另请注意,每个组件都需要返回自身,而不是组件 *,因为这会隐藏子功能。
compStruct.components 是组件 *s 的向量。
template <typename CompType>
inline CompType getComponent()
{
for(Component * currComp : compStruct.components)
{
if (static_cast<CompType>(currComp)!= nullptr)
{
return static_cast<CompType>(currComp);
}
}
return nullptr;
}
这是一个通用组件的例子
#pragma once
#include "Component.h"
#include "Animation2D.h"
class AnimationComponent : public Component
{
public:
AnimationComponent(GameObject*x) :Component(x) {}
~AnimationComponent() {}
void stepAnimation(double delta);
//add overload for 3d animations
int addAnimation(Animation2D);
void setAnimation(int);
private:
};
以及组件基类:
#pragma once
class GameObject;
class Component
{
public:
Component(GameObject * h) { host = h; }
virtual ~Component() {}
GameObject* getHost() { return host; }
protected:
GameObject * host = nullptr;
};
【问题讨论】:
-
您可能想要
dynamic_cast,但假设Component是多态的。你能提供一个minimal reproducible example 来确定吗? -
动态转换需要包含该类我很确定,这在这种情况下不起作用,因为我希望能够使用任何组件类型(再次,我认为?)。无论如何,我现在将包含 MCV 示例:)
-
如果你想接收这样一个,你需要转换为指针;
static_cast不返回空指针,除非转换的指针已经是它本身... -
既然我们谈论的是一个函数模板,那么在模板实例化时(即调用函数时)定义类就足够了)。我很确定使用它的代码会涵盖这些内容。
-
Dynamic Cast 修复了它。谢谢!
标签: c++ templates components