我有 2 个资源管理类DeviceContext
,OpenGLContext
它们都是class DisplayOpenGL
. 资源生命周期与DisplayOpenGL
. 初始化看起来像这样(伪代码):
DeviceContext m_device = DeviceContext(hwnd);
m_device.SetPixelFormat();
OpenGLContext m_opengl = OpenGLContext(m_device);
问题是对 SetPixelFormat() 的调用,因为我不能在DisplayOpenGL
c'tor 的初始化程序列表中这样做:
class DisplayOpenGL {
public:
DisplayOpenGL(HWND hwnd)
: m_device(hwnd),
// <- Must call m_device.SetPixelFormat here ->
m_opengl(m_device) { };
private:
DeviceContext m_device;
OpenGLContext m_opengl;
};
我可以看到的解决方案:
- 插入
m_dummy(m_device.SetPixelFormat())
- 不起作用,因为 SetPixelFormat() 没有 retval。(如果它有 retval,你应该这样做吗?) - 使用
unique_ptr<OpenGLContext> m_opengl;
而不是OpenGLContext m_opengl;
.
然后初始化为m_opengl()
,在 c'tor 正文中调用 SetPixelFormat() 并使用m_opengl.reset(new OpenGLContext);
SetPixelFormat()
来自DeviceContext
c'tor 的电话
这些解决方案中哪一个更可取,为什么?有什么我想念的吗?
如果重要的话,我在 Windows 上使用 Visual Studio 2010 Express。
编辑:我最感兴趣的是决定其中一种方法所涉及的权衡。
m_dummy()
不起作用并且看起来不优雅,即使它会unique_ptr<X>
对我来说很有趣 - 我什么时候会使用它而不是“普通”X m_x
成员?除了初始化问题外,这两种方法在功能上似乎或多或少是等效的。SetPixelFormat()
来自c'tor的电话DeviceContext
当然有效,但对我来说感觉不干净。DeviceContext
应该管理资源并启用它的使用,而不是对用户强加一些随机像素格式策略。- stijn's
InitDev()
看起来是最干净的解决方案。
在这种情况下,我几乎总是想要一个基于智能指针的解决方案吗?