0

私はライブラリとデモプロジェクトを書いています。プロジェクトは、使用するライブラリのバージョンを気にしません (gfx バックエンドとして、sdl、directx、または好きなものを使用できます)。オブジェクトを取得するには

Obj *obj = libname_newDevice();

さて、削除を使用する必要がありobj->deleteMe();ますか? 私は正確に新しいことをしているわけではないので、削除を行うべきではないのでお願いします?

Obj インターフェイスを持つobj->create(theType);クラスを返すものがあります。私の本当の質問は、インターフェイスに deleteMe があるので必要ですか、libname_deleteDevice();それとも問題ありませんか?obj->deleteMe()

4

5 に答える 5

11

内部の作成を抽象化しているためlibname_newDevice()(これは良いアプローチではないと言わざるを得ません)、 のようなものを使用して破棄する必要がありますlibname_destroyDevice (obj)

そして、Martin からのコメントが示唆するように、スタック上に作成する必要があるカスタム クラスのコンストラクターとデストラクターにそれらを配置するのが最善であり、コンパイラーが残りを処理します。

于 2008-11-12T16:45:37.180 に答える
4

質問を明確にしてください。それは私には全くわかりません。

  • なぜグラフィカルなバックエンドについて話すのですか?それは質問に関連していますか?
  • ライブラリをどのように設計するか、またはどのように使用するかを尋ねていますか?

オブジェクトを作成するためのオブジェクトファクトリを用意することをお勧めします。これがの役割だと思いlibname_newDevice()ます。

ライブラリは、オブジェクト(obj->DeleteMe()またはなどlibname_Delete(obj))を削除する方法も提供する必要があります。

C ++に依存しないでくださいdelete。呼び出し元とライブラリは、メモリとリソースの割り当てに関して異なるバージョンのコンパイラでコンパイルされている可能性があります。したがって、libが作成したオブジェクトを削除した方が安全です。

于 2008-11-12T16:52:34.827 に答える
3

私はさらに一歩進みます。
ファクトリ関数を使用して作成している場合、ファクトリ関数を使用して破棄するのが論理的かもしれません。これに加えて、すべてを適切かつ安全に実行できるように、オブジェクトにラップします。

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.
于 2008-11-12T17:16:22.937 に答える
1

最善の方法は、 RAIIを尊重し、いくつかの参照カウント ラッパー オブジェクトを用意することだと思います (カスタムデアロケーターでshared_ptrを使用することもできます)。

于 2008-11-12T17:13:23.630 に答える
0

Obj::deleteMe() を実装したくないことは間違いありません。次のようにする必要があります。

delete this;

あなたがまだ this->deleteMe() の中にいる間に。Jaywalker の提案に従い、destroy 関数が Obj* をパラメーターとして受け取るようにします。

于 2008-11-12T17:10:06.100 に答える