2012-12-19 23 views
43

Czy robię to dobrze? Próbuję delegować konstruktor klasy C++, ponieważ jest to zasadniczo ten sam kod powtarzający się 3 razy. Czytam w C++ x11 i czytam, że g ++ 4.7.2 pozwala na to, ale nie jestem pewien, czy robię to po prawej:Delegat Konstruktor 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? 
} 

czy trzeba zrobić:

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

Drugi ma rację. Czy to się nie kompiluje? – chris

+1

Obie kompilacji. Zastanawiałem się tylko, czy potrzebuję wersji listy inicjalizacyjnej lub czy pierwsza jest akceptowalna. – Brandon

+11

Ach, widzę twój dylemat. Pierwszy tworzy nienazwany obiekt i nic z nim nie robi, podobnie jak "int (5);". – chris

Odpowiedz

34

trzeba zrobić drugi. Delegowanie konstruktorów działa tylko na liście inicjalizacyjnej konstruktora, w przeciwnym razie po prostu utworzymy tymczasowy lub wykonamy inne błędy, o których wspomniałeś.

+1

Ah to jest dokładnie to, co potrzebowałem wiedzieć. Jeśli możesz, możesz odpowiedzieć na to pytanie: Czy muszę usunąć HBitmap w drugiej za pomocą DeleteObject? Czy może po prostu tak zostawić? Również zamierzam oznaczyć twoją odpowiedź jako zaakceptowaną w 10 minut, ponieważ nie pozwoli mi to wcześniej zaakceptować. – Brandon

+2

Tak, oczywiście, musisz wywołać 'DeleteObject'. To nie ma znaczenia dla reszty kodu w twoim pytaniu. Jeśli wywołasz 'LoadImage' i powiedzie się, to musisz w pewnym momencie zwolnić wynik. Wydaje się, że to miejsce jest w destruktorze klasy. –

37

Poprawna składnia jest

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

    char _x; 
    int _y; 
}; 

Twój pierwszy przykład tworzy tymczasowy, który jest niszczony od razu.

1

Drugi przykład z użyciem listy inicjalizacyjnej jest prawidłowy. Pierwszy przykład kończy się tworzeniem tymczasowego obiektu.