2012-12-19 35 views
43

Bunu doğru mu yapıyorum? Ben bir C++ sınıf kurucusunu temelde aynı kod 3 kez tekrarlayan şekilde temsil etmeye çalışıyorum. C++ x11'i okudum ve g ++ 4.7.2'nin buna izin verdiğini okudum ama bunu yapıyorumsa emin değilim. sağ:Temsilci Oluşturucu 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? 
} 

VEYA yapmam gerekiyor:

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

İkincisi doğru. Derleme yapmıyor mu? – chris

+1

Her ikisi de derlenir. Sadece başlangıç ​​listesi sürümüne ihtiyacım olup olmadığını veya ilk kabul edilebilir olup olmadığını merak ediyordum. – Brandon

+11

Ah, senin ikilemini görüyorum. Birincisi isimlendirilmemiş bir nesne yaratır ve onunla hiçbir ilgisi yoktur, int (5); 'gibi. – chris

cevap

34

Sen ikincisini yapmak gerekir. Yetki veren kurucular yalnızca kurucunun başlangıç ​​listesinde çalışırlar, aksi takdirde sadece geçici bir durum oluşturacak veya bahsettiğiniz gibi başka hatalar yapacaksınız.

+1

Ah, bilmem gereken şey bu. Eğer bunu yapabilirseniz, bunu cevaplayabilir misiniz: İkinci adımdaki HBitmap'i DeleteObject kullanarak silmem gerekir mi? Yoksa olduğu gibi bırakmak güzel mi? Ayrıca cevabınızı 10 dakika içinde kabul edeceğim, çünkü bundan önce kabul etmeme izin vermeyeceğim. – Brandon

+2

Evet, tabiki 'DeleteObject' olarak adlandırmanız gerekiyor. Yine de, sorunuzdaki kodun geri kalanıyla alakasız. 'LoadImage' adını verirseniz ve başarılı olursa, sonucu bir noktada boşaltmanız gerekir. Sınıfın yıkıcısı olan yer gibi görünüyor. –

37

doğru sözdizimi

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

    char _x; 
    int _y; 
}; 

İlk örnek, bir geçici olduğunu hemen yok edilir yaratır olduğunu.

1

Başlatıcı listesini kullanan ikinci örnek doğru olanıdır. İlk örnek, geçici bir nesne oluşturulacak.