我正在编写一个 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 会导致 m_hFont 被 Font 类析构函数删除。我很欣赏我可以在堆上创建字体并让图形类负责字体的整体“生命周期”。我想这确实是一个设计问题。是不是更好...
- 为包装 Windows 句柄的类实现引用计数。
- 在堆上创建包装类。
- 还有什么方法?
我注意到 MFC 在其包装器中有一个明确的 DeleteObject ,但这当然不会导致自动资源取消分配。
任何帮助/建议表示赞赏。
谢谢
编辑:我认为这更像是一个复制构造函数问题。即我的 Font 类创建了一个 Windows FONT 句柄,但由于我将 Font 对象按值传递给显示而被破坏。