我有2个资源管理类DeviceContextOpenGLContext都是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应该管理资源并启用其使用,而不是对用户强加一些随机像素格式策略。
  • stijn's 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;
    };
    

    10-08 19:20