在调试期间获取C ++运行时类型?

时间:2012-12-06 23:22:35

标签: c++ visual-c++ visual-studio-2012

好奇,如果有人对此有任何想法;研究实现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的列表,我想不出办法。如果可能的话,想要一些全自动:)

1 个答案:

答案 0 :(得分:3)

根据David Rodriguez的评论 - 制作GameObject多态(在我的例子中,通过使析构函数为虚拟)在调试器中改变了它的分类,并向运行时类型信息显示了一个vptr,这就行了。