我正在使用OGRE而且我遇到了一个与ORGE没有多大关系的问题,但这是我正在处理的一个真正的C ++问题。 ORGE只是帮助解决问题的背景。
有一个像
这样的宏OGRE_DELETE_T(obj, ExternalClass);
但是,为了调用delete,我需要传入类的类型作为第二个参数。但是,比方说我有一个基数class A
,然后是class B
,class C
,class D
等。如果我要存储std::vector
只A
{1}}指针,但实际上我可能已将它们实例化为B
,C
或A
的某些派生,我怎样才能将构造的实际类的类型传递给此宏?当我去删除它时,我不知道派生对象是什么类型,我只知道有class A
个指针。
我想也许使用dynamic_cast
,但是,我不喜欢运行时性能,我还需要有一些类型的查找表来检查。
答案 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();