2

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

4

1 回答 1

3

根据 David Rodriguez 的评论 - 使 GameObject 具有多态性(在我的情况下,通过使析构函数虚拟化)在调试器中更改了其分类并向运行时类型信息显示 vptr,这起到了作用。

于 2012-12-06T23:30:59.540 回答