晚上好,我第一次在这里问一个问题,所以请让我知道是否有我犯的错误。检查创建的对象的类是否来自另一个类
我和我的朋友最近也开始编码了一个基于组件的游戏引擎,并跑进已经困扰我好几天的问题。 我有一个实体类,它存储了附加到它的组件列表,并且我已经能够通过模板成功地向组件添加和删除组件。下面示出的简化的代码:
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部门。
*“那么,让我知道,如果我犯了什么错误”* - 是的,你还没有发布MCVE。你的代码不能被编译。使其可编译并将其降低到重现问题所需的最低限度。 –