好奇,如果有人对此有任何想法;研究实现GameObject树的游戏引擎。各种特定游戏对象继承自该类型(BouncingBall,StatScreen或其他)。
class GameObject {
public:
vector<Component *> Components;
vector<GameObject *> Children;
GameObject *Parent;
};
因此,在运行时,游戏将拥有一个巨大的树,所有不同的类型。不幸的是,Children向量中的对象在调试器中都被报告为“GameObject *”,因此很难分辨出什么是什么。
我提出的最佳解决方案是将类型存储为构造中的成员变量:
class GameObject {
public:
// ...
const char *Type;
// Saves current class name as Type.
template<class T>
void StoreTypeName( T *thisPointer ) {
this->Type = typeid( *thisPointer ).name();
}
};
但是在每个对象构造函数中我都要记得调用StoreTypeName:
class FancyBlinkingObject : public GameObject {
public:
FancyBlinkingObject() {
StoreTypeName( this );
}
};
任何其他可能的技巧自动执行此操作?在调试器端(Visual Studio 2012)还是在代码中?
我想到了某种中央动态演员测试功能:
if ( dynamic_cast<FancyBlinkingObject *>( basePointer ) ) {
return "FancyBlinkingObject";
}
if ( dynamic_cast<UglyBlueObject *>( basePointer ) ) {
return "UglyBlueObject";
}
但是如果没有我必须手动维护if的列表,我想不出办法。如果可能的话,想要一些全自动:)
答案 0 :(得分:3)
根据David Rodriguez的评论 - 制作GameObject多态(在我的例子中,通过使析构函数为虚拟)在调试器中改变了它的分类,并向运行时类型信息显示了一个vptr,这就行了。