2012-12-19 19 views
43

Sto facendo bene? Sto provando a delegare un costruttore di classi C++ in quanto è praticamente lo stesso codice che si ripete 3 volte. Ho letto su C++ x11 e ho letto che g ++ 4.7.2 consente questo, ma non sono sicuro se lo sto facendo a destra:Delegate Constructor C++

Bitmap::Bitmap(HBITMAP Bmp) 
{ 
    //Construct some bitmap stuff.. 
} 

Bitmap::Bitmap(WORD ResourceID) 
{ 
    HBITMAP BMP = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ResourceID), IMAGE_BITMAP, 0, 0, LR_SHARED); 

    Bitmap(BMP); //Delegates to the above constructor? Or does this create a temporary? 
} 

o devo fare:

Bitmap::Bitmap(HBITMAP Bmp) 
{ 
    //Construct some bitmap stuff.. 
} 

Bitmap::Bitmap(WORD ResourceID) : Bitmap((HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ResourceID), IMAGE_BITMAP, 0, 0, LR_SHARED)) 
{ 
} 
+5

Il secondo è giusto. Non viene compilato? – chris

+1

Entrambi compilano. Mi stavo chiedendo se avevo bisogno della versione dell'elenco di inizializzazione o se il primo è accettabile. – Brandon

+11

Ah, vedo il tuo dilemma. Il primo crea un oggetto senza nome e non fa nulla con esso, proprio come 'int (5);' would. – chris

risposta

34

Hai bisogno di fare il secondo. La delega dei costruttori funziona solo nella lista di inizializzazione del costruttore, altrimenti creerai solo una temporanea o farai altri errori come hai detto.

+1

Ah questo è esattamente quello che dovevo sapere. Se puoi, puoi rispondere a questo: Devo cancellare l'HBitmap nella seconda usando DeleteObject? O va bene lasciarlo così com'è? Inoltre segnerò la tua risposta come accettata in 10 minuti perché non mi permetterà di accettare prima. – Brandon

+2

Sì, ovviamente è necessario chiamare 'DeleteObject'. Questo è irrilevante per il resto del codice nella tua domanda, però. Se si chiama 'LoadImage', e ha successo, allora è necessario liberare il risultato ad un certo punto. Sembra che il posto dove farlo sia nel distruttore della classe. –

37

La sintassi corretta è

struct Foo { 
    Foo(char x, int y) : _x{x}, _y(y) {} 
    Foo(int y) : Foo('a', y) {} 

    char _x; 
    int _y; 
}; 

Il tuo primo esempio viene creato un temporaneo che viene distrutta subito.

1

Il secondo esempio che utilizza l'elenco di inizializzazione è quello corretto. Il primo esempio sta per finire con la creazione di un oggetto temporaneo.