我有2个资源管理类DeviceContext
和OpenGLContext
都是class DisplayOpenGL
的成员。资源生存期与DisplayOpenGL
绑定(bind)。初始化看起来像这样(伪代码):
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()没有检索。 (如果有回送,您应该这样做吗?)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
应该管理资源并启用其使用,而不是对用户强加一些随机像素格式策略。 InitDev()
看起来是最干净的解决方案。 在这种情况下,我是否几乎总是需要基于智能指针的解决方案?
最佳答案
Comma operator to the rescue!表达式(a, b)
将首先评估a
,然后评估b
。
class DisplayOpenGL {
public:
DisplayOpenGL(HWND hwnd)
: m_device(hwnd),
m_opengl((m_device.SetPixelFormat(), m_device)) { };
private:
DeviceContext m_device;
OpenGLContext m_opengl;
};