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