У меня есть 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. (стоит ли это делать, если у него есть ретвал?) - Используйте
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
InitDev()
выглядит как самое чистое решение.
Всегда ли мне в таких случаях нужно решение на основе интеллектуальных указателей?