1

Windows Window 関数のラッパーを書きたいとします。次に、Window コンストラクターでウィンドウを作成し、仮想関数を呼び出す内部ウィンドウ プロシージャを関連付けます。

優先クリーンアップとは何ですか?

  • RAII に従って、そのクラスのデストラクタは DestroyWindow を呼び出す必要があります。次に、WM_CLOSE は 0 を返し、ウィンドウが範囲外であることを何らかの方法で通知する必要があります (RAII ではない Manager を使用してですか?)。

  • 「delete this」によって WM_DESTROY ですべてのクリーンアップを実行し、ウィンドウを new によって強制的に割り当てます。

4

1 に答える 1

2

後者のアプローチ ( delete this) は、他のクライアントがそれを参照している場合 (無効なポインターが残っている場合) に問題があり、オブジェクトをヒープに割り当てる必要があり、何らかの参照カウントを導入する必要があります。

RAII アプローチはより賢明です。結局のところ、オブジェクトが画面から消えてもまだ生きている (つまり、ウィンドウが隠れている) ことは問題ありません。ウィンドウ自体の寿命をオブジェクトの寿命に結び付ける必要がある理由がわかりません。コンストラクタでウィンドウを作成する必要はなく、デストラクタでウィンドウを破棄する必要もありません。多くの場合、これは、実際のウィンドウがコンストラクターで自動的に破棄されるかどうかを制御するフラグをコンストラクターに提供することで解決されます。いずれかが必要なシナリオがあります。

ウィンドウ オブジェクトを「外部」HWND に一時的にアタッチするシナリオもあります。その場合、オブジェクトとウィンドウの有効期間を切り離す必要があるため、最初のアプローチはうまく機能しません。

ちょうど私の2セント。

于 2013-10-02T17:04:20.140 に答える