我有一个 Component
类:
class Component
{
}
然后一个Collider
从它继承的类:
class Collider :public Component
{
}
还有一个 SphereCollider
继承自 Collider
:
class SphereCollider :public Collider
{
}
最后,一个 GameObject
您可以使用添加或删除组件的类。
GameObject.h header :
class GameObject
{
//Add functionality
template <class T>
T& AddComponent();
//Get functionality
template <typename T>
T& GetComponent();
}
GameObject.cpp 来源:
template <typename T>
T& GameObject::AddComponent(){}
template <typename T>
T& GameObject::GetComponent(){}
//Explicit instantiation
template Component &GameObject::GetComponent<Component>();
template Component &GameObject::AddComponent<Component>();
template SphereCollider &GameObject::GetComponent<SphereCollider>();
template SphereCollider &GameObject::AddComponent<SphereCollider>();
一切正常。我可以在没有指针的情况下从 GameObject 添加或获取组件,如下所示:
GameObject gameObject;
SphereCollider sCollider1 = gameObject.AddComponent<SphereCollider>();
SphereCollider sCollider2 = gameObject.GetComponent<SphereCollider>();
Component sCollider3 = gameObject.GetComponent<Component>();
问题:
我需要将其用作库并隐藏源文件。因为我为 Component
添加了显式实例化和 SphereCollider
GameObject.cpp 源中的类,只有那些可以编译。
例如,
Collider sCollider = gameObject.GetComponent<InnoEngine::Collider>();
将不会编译,除非我也添加:
template Collider &GameObject::GetComponent<Collider>();
template Collider &GameObject::AddComponent<Collider>();
在 GameObject.cpp 源中。
因为所有使用 GetComponent
的东西和 AddComponent
函数继承自 Component
类,有没有办法为每个继承自 Component
的类自动进行显式实例化?上课?
我试过了 template Component &GameObject::GetComponent<Component>();
和 template Component &GameObject::AddComponent<Component>();
但这没有用,只给了我“未解析的外部符号”错误。
目前我唯一的选择是将所有模板函数放在头文件中,但这会为 GetComponent
公开一个重要的代码。和 AddComponent
模板函数。
最佳答案
不,这是不可能的。
1) template Component &GameObject::GetComponent<Component>()
是仅针对具体 Component
的显式实例化类(class)。编译器找不到纯虚方法的定义,因此您会收到链接器错误。
2)一些派生自Component
的类如果不添加相应的包含,在 GameObject.cpp 中可能无法访问。所以在一般情况下,编译器甚至在理论上也无法获得所有继承者的列表,因为此信息仅在链接时可用。
关于c++ - 所有派生类的显式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44248644/