仅检索对象的类型

时间:2012-04-22 09:04:38

标签: c++ oop rtti ogre

我正在使用OGRE而且我遇到了一个与ORGE没有多大关系的问题,但这是我正在处理的一个真正的C ++问题。 ORGE只是帮助解决问题的背景。

有一个像

这样的宏
OGRE_DELETE_T(obj, ExternalClass);

但是,为了调用delete,我需要传入类的类型作为第二个参数。但是,比方说我有一个基数class A,然后是class Bclass Cclass D等。如果我要存储std::vectorA {1}}指针,但实际上我可能已将它们实例化为BCA的某些派生,我怎样才能将构造的实际类的类型传递给此宏?当我去删除它时,我不知道派生对象是什么类型,我只知道有class A个指针。

我想也许使用dynamic_cast,但是,我不喜欢运行时性能,我还需要有一些类型的查找表来检查。

2 个答案:

答案 0 :(得分:2)

只需在宏中传递派生对象的类型即可。如果你的基础有一个virtual析构函数,它会正确删除你的指针。

答案 1 :(得分:0)

我知道这个问题很老,但这个答案可能对其他人有所帮助。

此宏用于跟踪您的内存,如果您需要在派生类型上使用它,您将不得不妥协一点。您可以这样做的一种方法是创建一个适当删除对象的虚函数。无论如何,在使用OGRE_ALLOC_T或OGRE_NEW_T时,您必须调用特定的销毁宏,以便用户可以了解这种特殊情况。

class Parent
{
public:
    virtual void deleteSelf() = 0;
};

class A : public Parent
{
public:
    virtual void deleteSelf()
    {
        A* p = this;
        OGRE_DELETE_T(p, A);
    }
};

这样你就可以这样删除它:

Parent* p = OGRE_NEW_T(A);
p->deleteSelf();