我这样做对吗?我正在尝试委托 C++ 类构造函数,因为它基本上是重复 3 次的相同代码。我阅读了 C++x11 并了解到 g++ 4.7.2 允许这样做,但我不确定我是否正在这样做右:
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))
{
}
你需要做第二件事。委托构造函数仅适用于构造函数的初始化列表,否则您将只是创建一个临时对象或犯像您提到的其他错误。
正确的语法是
struct Foo {
Foo(char x, int y) : _x{x}, _y(y) {}
Foo(int y) : Foo('a', y) {}
char _x;
int _y;
};
您的第一个示例创建了一个临时对象,该临时对象立即被销毁。
使用初始化列表的第二个示例是正确的。 第一个示例最终将创建一个临时对象。
如果您想在某些命令式逻辑之后使用构造函数委托,您可以选择从临时对象中移动分配
*this
:
Foo() {
// calculate stuff…
*this = Foo(stuff, calculated, above);
}