2 つのリソース管理クラスがDeviceContext
あり、OpenGLContext
どちらも のメンバーですclass DisplayOpenGL
。リソースの有効期間は に関連付けられていDisplayOpenGL
ます。初期化は次のようになります (疑似コード):
DeviceContext m_device = DeviceContext(hwnd);
m_device.SetPixelFormat();
OpenGLContext m_opengl = OpenGLContext(m_device);
DisplayOpenGL
問題は SetPixelFormat() の呼び出しです。これは、 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()
、 c'tor 本体で SetPixelFormat() を呼び出して使用しますm_opengl.reset(new OpenGLContext);
- 担当
SetPixelFormat()
者からの電話DeviceContext
これらのソリューションのどれが望ましいですか?またその理由は? 不足しているものはありますか?
問題があれば、Windows で Visual Studio 2010 Express を使用しています。
編集:私は主に、これらの方法のいずれかを決定する際のトレードオフに関心があります。
m_dummy()
機能しませんし、機能したとしてもエレガントではないようですunique_ptr<X>
は私にとって興味深いものです。「通常の」X m_x
メンバーの代わりに使用するのはいつですか? 2 つの方法は、初期化の問題を除けば、機能的にほぼ同等のようです。- c'tor
SetPixelFormat()
からの呼び出しはDeviceContext
確かに機能しますが、私には不潔に感じます。DeviceContext
ユーザーにランダムなピクセル形式のポリシーを課すのではなく、リソースを管理してその使用を有効にする必要があります。 - stijn's
InitDev()
は、最もクリーンなソリューションのように見えます。
とにかく、そのような場合、ほとんど常にスマートポインターベースのソリューションが必要ですか?