Ho due classi di gestione risorse DeviceContext
e OpenGLContext
entrambi membri di class DisplayOpenGL
. La durata della risorsa è legata a DisplayOpenGL
. L'inizializzazione assomiglia a questo (pseudo codice):C++ - Esegue una funzione prima di inizializzare un membro della classe
DeviceContext m_device = DeviceContext(hwnd);
m_device.SetPixelFormat();
OpenGLContext m_opengl = OpenGLContext(m_device);
Il problema è la chiamata a SetPixelFormat(), dal momento che non posso farlo nella lista di inizializzazione del 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;
};
Soluzioni che posso vedere:
- Inserimento
m_dummy(m_device.SetPixelFormat())
- non funzionerà come SetPixelFormat() non ha retval. (si dovrebbe fare questo se avesse un retval?) - Utilizzare
unique_ptr<OpenGLContext> m_opengl;
anzichéOpenGLContext m_opengl;
.
Poi inizializzare comem_opengl()
, chiamare SetPixelFormat() nel corpo c'tor e utilizzarem_opengl.reset(new OpenGLContext);
- chiamata
SetPixelFormat()
daDeviceContext
c'tor
Quale di queste soluzioni è preferibile e perché? Qualcosa che mi manca?
Sto usando Visual Studio 2010 Express su Windows, se è importante.
Modifica: Sono principalmente interessato ai compromessi coinvolti nel decidere per uno di questi metodi.
m_dummy()
non funziona e sembra poco elegante, anche se sarebbeunique_ptr<X>
è interessante per me - quando sarebbe lo uso al posto di un "normale"X m_x
membro? I due metodi sembrano essere funzionalmente più o meno equivalenti, ad eccezione dei problemi di inizializzazione.- Chiamare
SetPixelFormat()
daDeviceContext
c'tor funziona sicuramente ma non mi sembra impuro.DeviceContext
dovrebbe gestire la risorsa e abilitarne l'uso, non imporre alcun criterio di formato pixel casuale agli utenti. - stijn's
InitDev()
sembra la soluzione più pulita.
Preferisco quasi sempre una soluzione basata su puntatore intelligente in questi casi?
Questo mi sembra il tipo di caso in cui una funzione di fabbrica statica può essere più utile di un costruttore. – cdhowie
mi sembra che la terza soluzione possa funzionare. C'è qualche ragione per cui hai scelto di non farlo? Inoltre, perché non usare una libreria come GLFW per caricare il tuo contesto openGL? –
Non ero a conoscenza di GLFW quando ho iniziato. Dà un'occhiata, grazie. –