質問
ライブラリとデモプロジェクトを書いています。プロジェクトは、使用するlibのバージョンを気にしません(sdl、directx、またはgfxバックエンドとして好きなものを使用できます)。オブジェクトを取得するには
Obj *obj = libname_newDevice();
今、deleteを使用するべきですか、それとも obj-> deleteMe();
を行うべきですか?私は正確に新しいことをしていないので、削除を行うべきではないので尋ねますか?
Objインターフェイスを持つクラスを返す obj-> create(theType);
があります。
私の本当の質問は、 libname_deleteDevice();
が必要なのか、またはインターフェイスにdeleteMeがあるので obj-> deleteMe()
でいいのですか?
解決
さらに一歩進めます。
ファクトリ関数を使用して作成する場合、ファクトリ関数を使用して破棄するのが論理的である場合があります。これに加えて、すべてのオブジェクトを適切に実行し、安全に実行できるようにします。
class ObjWrap
{
public:
ObjWrap()
:obj(libname_newDevice())
{}
~ObjWrap()
{ libname_deleteDevice(obj);}
private:
ObjWrap(ObjWrap const&); // Dont copy
void operator=(ObjWrap const&); // Dont copy
Obj* obj;
}; // If you want to copy then you need to extra work on ref counting
// This may need some form of smart pointer.
他のヒント
libname_newDevice()
内で作成を抽象化しているため(これは良いアプローチではないと言わなければなりません)、 libname_destroyDevice(obj)
。
そして、Martinからのコメントが示唆しているように、それらをカスタムクラスのコンストラクタとデストラクタに配置するのが最善です。スタックで作成するだけで、コンパイラが残りを処理します。
質問を明確にしてください。私には完全に不明瞭です。
- グラフィカルなバックエンドについて話すのはなぜですか?質問に関連していますか?
- ライブラリの設計方法または使用方法を尋ねていますか
オブジェクトを作成するオブジェクトファクトリを用意することをお勧めします。これは libname_newDevice()
の役割だと思います。
ライブラリは、オブジェクトを削除する方法も提供する必要があります( obj-> DeleteMe()
または libname_Delete(obj)
など)。
C ++の delete
に依存しないでください。呼び出し側とライブラリは、異なるバージョンのコンパイラでコンパイルされている可能性があり、メモリとリソースの割り当てに関して異なる処理を行います。したがって、libが作成したオブジェクトを削除する方が安全です。
最善の方法は、 RAII を尊重し、ラッパーオブジェクトをカウントする参照を取得することだと思います( shared_ptr をカスタムデアロケーターとともに使用することもできます。 )。
Obj :: deleteMe()を実装することは絶対に望まないでしょう。次のようなことをしなければなりません:
delete this;
あなたがまだthis-> deleteMe()の中にいる間に。 Jaywalkerの提案に従い、破壊関数にObj *をパラメーターとして使用させます。