【发布时间】:2012-11-09 15:43:08
【问题描述】:
我有 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 body中调用SetPixelFormat()并使用m_opengl.reset(new OpenGLContext); - 从
DeviceContextc'tor 致电SetPixelFormat()
哪些解决方案更可取,为什么?我有什么遗漏吗?
如果重要的话,我在 Windows 上使用 Visual Studio 2010 Express。
编辑:我最感兴趣的是在决定其中一种方法时所涉及的权衡。
-
m_dummy()不起作用,即使它会看起来也不优雅 -
unique_ptr<X>对我来说很有趣——我什么时候可以使用它而不是“普通”X m_x成员?除了初始化问题外,这两种方法在功能上似乎或多或少是等效的。 - 从
DeviceContextc'tor 调用SetPixelFormat()确实有效,但我觉得不干净。DeviceContext应该管理资源并启用它的使用,而不是对用户强加一些随机像素格式策略。 -
stijn's
InitDev()看起来是最干净的解决方案。
在这种情况下,我是否总是需要基于智能指针的解决方案?
【问题讨论】:
-
这似乎是静态工厂函数可能比构造函数更有用的情况。
-
在我看来,您的第三个解决方案会起作用。你有什么理由选择不这样做吗?另外,为什么不使用 GLFW 之类的库来加载您的 OpenGL 上下文?
-
刚开始的时候我并不知道 GLFW。看看,谢谢。
-
另一种解决方案是使用逗号运算符:stackoverflow.com/a/13314512/6210
标签: c++ constructor initialization smart-pointers initialization-list