У меня есть 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(), вызовите SetPixelFormat() в теле c'tor и используйтеm_opengl.reset(new OpenGLContext); - Вызов
SetPixelFormat()изDeviceContextc'tor
Какое из этих решений является предпочтительным и почему? Что-нибудь мне не хватает?
Я использую Visual Studio 2010 Express в Windows, если это имеет значение.
Изменить: Меня больше интересуют компромиссы, связанные с решением одного из этих методов.
-
m_dummy()не работает и кажется неэлегантным, даже если он Мне интересен -
unique_ptr<X>- когда я буду использовать его вместо "нормального" членаX m_x? Эти два метода кажутся функционально более или менее эквивалентными, за исключением проблем с инициализацией. - Вызов
SetPixelFormat()отDeviceContextc'tor, безусловно, работает, но для меня он нечист.DeviceContextдолжен управлять ресурсом и активировать его использование, а не накладывать на пользователей какую-то политику случайных пикселей. - stijn's
InitDev()выглядит как самое чистое решение.
В любом случае, я всегда предпочитаю решение на основе умного указателя в таких случаях?