gpt4 book ai didi

C++ - 在初始化类成员之前运行一个函数

转载 作者:IT老高 更新时间:2023-10-28 21:57:08 25 4
gpt4 key购买 nike

我有 2 个资源管理类 DeviceContextOpenGLContext两者都是 class DisplayOpenGL 的成员.资源生命周期与 DisplayOpenGL 相关联。 .初始化如下(伪代码):

DeviceContext m_device = DeviceContext(hwnd);
m_device.SetPixelFormat();
OpenGLContext m_opengl = OpenGLContext(m_device);

问题是调用 SetPixelFormat(),因为我不能在 DisplayOpenGL 的初始化列表中这样做。导演:

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()来自 DeviceContext c'tor 当然可以,但对我来说感觉不干净。 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;
};

关于C++ - 在初始化类成员之前运行一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com