好奇是否有人对此有任何想法;在实现游戏对象树的游戏引擎上工作。各种特定的游戏对象都继承自该类型(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 的列表。如果可能的话,想要一些完全自动化的东西。:)