2012-04-22 15 views
0

私はOGREを使用していますが、私はORGEにあまり特有ではない問題にぶつかりましたが、私が扱っているgenreal C++の問題です。 ORGEは質問の文脈に役立ちます。このようオブジェクトの型だけを取得する

OGRE_DELETE_T(obj, ExternalClass); 

ようなものであるマクロが

があるしかし、削除が呼び出されるようにするために、私は2番目のパラメータとしてクラスの型で渡す必要があります。しかし、私はちょうどAポインタのstd::vectorを保存した場合、私は等をベースclass A、その後class Bclass Cclass Dを持っ例えば言うが、実際に私がBC、またはAの一部deriviativeとしてそれらをインスタンス化していることどのようにしてこのマクロに構築された実際のクラスの型を渡すことができますか?私はそれを削除するために行くときにどのような型のオブジェクトが派生しているかわからない、私が知っているすべてはclass Aポインタです。

私はおそらくdynamic_castを使用していると思っていましたが、私は実行時のパフォーマンスが気に入らず、検査するタイプのルックアップテーブルを用意する必要がありました。

答えて

2

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

+0

は申し訳ありませんが、私は私が思うより特定されている必要があります。私は派生したオブジェクトのタイプが何であるか分かりません。私が知っているのは、それが 'クラスA 'なので、' B'、 'C'なのか分かりません。 – jack

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(); 
関連する問題