0

私はOGREを使用していますが、ORGEにあまり固有ではない問題に遭遇しましたが、これは私が扱っている一般的なC++の問題です。ORGEは、質問のコンテキストを支援するだけです。

次のようなマクロがあります

OGRE_DELETE_T(obj, ExternalClass);

ただし、deleteを呼び出すには、クラスの型を2番目のパラメーターとして渡す必要があります。ただし、たとえば、ベース、class A次にclass B、、などがあるとします。ポインタだけを格納する場合でも、実際には、、、またはの派生物としてインスタンス化した可能性があります。どのようにして、のタイプを渡すことができますか。このマクロに組み込まれた実際のクラス?派生オブジェクトを削除しようとしたときに、そのオブジェクトがどのタイプであるかはわかりません。わかっているのは、ポインタがあることだけです。class Cclass Dstd::vectorABCAclass A

おそらく使用することを考えdynamic_castましたが、ランタイムパフォーマンスが気に入らなかったため、チェックするタイプのルックアップテーブルも必要になります。

4

2 に答える 2

2

派生オブジェクトのタイプをマクロに渡すだけです。virtualベースにデストラクタがある場合は、ポインタが適切に削除されます。

于 2012-04-22T09:14:22.320 に答える
0

この質問は古いことは知っていますが、この回答は他の人に役立つかもしれません。

このマクロはメモリを追跡するために使用されます。派生型で使用する必要がある場合は、インターフェイスを少し妥協する必要があります。これを行う 1 つの方法は、オブジェクトを適切に削除する仮想関数を作成することです。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 に答える