複数のプラットフォームで動作するように一部のソフトウェアを書き直すことができるように、C++ フレームワークを作成しています。Windows ハンドルを使用する一部のラッパー クラスの実装に関する質問です。次のコードを検討してください...
class Font
{
public:
Font(const LOGFONT& lf)
{
m_hFont = ::CreateFontIndirect(lf);
}
~Font()
{
::DeleteObject(m_hFont);
}
private:
HFONT m_hFont;
}
次に、次のように呼び出す可能性のある Display クラスがあります...
LOGFONT lf;
// initialise lf
Display d;
d.SetFont(Font(lf));
d.DrawText(0,0,"Some Text");
もちろん問題は、d.SetFont によって、Font クラスのデストラクタによって m_hFont が削除されることです。ヒープ上にフォントを作成し、フォントの全体的な「寿命」をグラフィックス クラスに任せることができたことに感謝します。これは本当に設計上の問題だと思います。したほうがいいのでしょうか...
- Windows ハンドルをラップするクラスの参照カウントを実装します。
- ヒープにラッパー クラスを作成します。
- 他の方法?
MFC のラッパーには明示的な DeleteObject があることに気付きましたが、もちろん、これによってリソースの割り当てが自動的に解除されるわけではありません。
ヘルプ/アドバイスをいただければ幸いです。
ありがとう
編集:これはコピーコンストラクターの質問だと思います。つまり、私の Font クラスは Windows FONT ハンドルを作成しますが、Font オブジェクトを値でディスプレイに渡すため破棄されます。