【问题标题】:Retrieving just the type of an object仅检索对象的类型
【发布时间】:2012-04-22 09:04:37
【问题描述】:

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

有一个宏,例如

OGRE_DELETE_T(obj, ExternalClass);

但是,为了调用 delete,我需要传入类的类型作为第二个参数。但是,假设我有一个基本 class A,然后是 class Bclass Cclass D 等。如果我要存储一个 std::vectorA 指针,但实际上我可能有将它们实例化为BCA 的一些派生词,我如何将构造的实际类的类型传递到这个宏中?去delete的时候不知道派生对象是什么类型,只知道有class A指针。

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

【问题讨论】:

    标签: c++ oop rtti ogre


    【解决方案1】:

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

    【讨论】:

    • 对不起,我想我应该更具体一些。我不知道派生对象的类型是什么。我只知道是class A,不知道是BC
    【解决方案2】:

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

    此宏用于跟踪您的内存,如果您需要在派生类型上使用它,您将不得不稍微妥协一下接口。您可以这样做的一种方法是创建一个适当地删除对象的虚拟函数。在使用 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();
    

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多