我有2個資源管理類DeviceContext
和OpenGLContext
都是class DisplayOpenGL
的成員。資源壽命與DisplayOpenGL
有關。初始化看起來是這樣的(僞代碼):C++ - 在初始化類成員之前運行函數
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
哪個這些解決方案的最好,爲什麼?我錯過了什麼?
我在Windows上使用Visual Studio 2010 Express,如果它很重要。
編輯:我最感興趣的是決定這些方法之一的權衡。
m_dummy()
不工作,似乎不雅,即使它會unique_ptr<X>
有趣的是,我 - 當我會用它來代替「正常」X m_x
會員?除了初始化問題外,這兩種方法似乎在功能上或多或少是等同的。- 從
DeviceContext
調用SetPixelFormat()
c'tor當然有效,但感覺對我不乾淨。DeviceContext
應該管理資源並啓用其使用,而不是對用戶強加一些隨機像素格式策略。 - stijn's
InitDev()
看起來像最乾淨的解決方案。
難道我幾乎總是想要一個基於智能指針的解決方案嗎?
這似乎是那種情況,其中一個靜態工廠函數可能比一個構造函數更加有用。 – cdhowie
在我看來,你喜歡你的第三種解決方案。你有沒有選擇不這樣做?另外,爲什麼不使用像GLFW這樣的庫來加載你的openGL上下文? –
我開始時並不知道GLFW。會看看,謝謝。 –