2012-12-19 197 views
43

我正在做对吗?我试图委托一个C++类的构造函数,因为它基本上是相同的代码重复3次..我读了C++ x11,并阅读g ++ 4.7.2允许这个,但我不知道如果我这样做右:委托构造函数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? 
} 

或做我需要做的:

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

第二个是正确的。它不会编译? – chris

+1

都编译。我只是想知道我是否需要初始化列表版本,或者如果第一个可以接受。 – Brandon

+11

啊,我看到你的困境。第一个创建一个未命名的对象,并且不做任何事情,就像'int(5);'会。 – chris

回答

34

你需要做第二。委托构造函数只能在构造函数的初始化列表中使用,否则您只会创建一个临时文件或者像您提到的那样执行其他错误。

+1

啊,这正是我需要知道的。如果可以,你可以回答这个问题:我需要使用DeleteObject删除第二个HBitmap吗?或者将它保持原样就可以了吗? 此外,我会在10分钟内将您的答案标记为已接受,因为在此之前它不会让我接受。 – Brandon

+2

是的,当然你需要调用'DeleteObject'。不过,这与您问题中的其他代码无关。如果您调用'LoadImage',并且成功,那么您需要在某个时候释放结果。看起来像是在类的析构函数中那样做的地方。 –

37

正确的语法是

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

    char _x; 
    int _y; 
}; 

你的第一个例子创建了一个临时性的即马上销毁。

1

使用初始值设定项列表的第二个例子是正确的。 第一个示例将最终创建一个临时对象。