0

我正在使用 OGRE,但我遇到了一个与 ORGE 无关的问题,而是我正在处理的一个典型的 C++ 问题。ORGE 只是帮助解决问题的上下文。

有一个宏,例如

OGRE_DELETE_T(obj, ExternalClass);

但是,为了调用 delete,我需要传入类的类型作为第二个参数。但是,比如说我有一个 base class A,然后class B, class C,class D等。如果我只存储一个std::vector指针A,但实际上我可能已经将它们实例化为B,C或 的一些衍生物A,我怎么能传递构造到这个宏中的实际类?当我去删除它时,我不知道派生对象是什么类型,我只知道有class A指针。

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

4

2 回答 2

2

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

于 2012-04-22T09:14:22.320 回答
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();
于 2013-05-22T15:36:36.827 回答