委托构造函数 C++
Posted
技术标签:
【中文标题】委托构造函数 C++【英文标题】:Delegate Constructor C++ 【发布时间】:2012-12-19 20:56:14 【问题描述】:我这样做对吗?我正在尝试委托一个 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))
【问题讨论】:
第二个是对的。它不会编译吗? 都编译。我只是想知道我是否需要初始化列表版本,或者第一个版本是否可以接受。 啊,我看到了你的困境。第一个创建了一个未命名的对象并且什么都不做,就像int(5);
那样。
实际上,第一个示例不应该编译,因为Bitmap(BMP);
声明了一个局部变量,名为BMP
,类型为Bitmap
。它不会创建临时的、未命名的对象。由于BMP
已经存在(类型HBITMAP
),它应该会导致多重定义错误。此外,Bitmap
需要有一个空/默认/标准构造函数才能编译此行。
@Pixelchemist 你在说什么..Bitmap(BMP);
肯定声明了一个Bitmap
类型的临时对象,BMP
作为参数。这段代码实际上是在发帖时编译的。我很好奇,问它有什么作用。
【参考方案1】:
你需要做第二个。委托构造函数只在构造函数的初始化列表中起作用,否则你只会创建一个临时的或犯你提到的其他错误。
【讨论】:
啊,这正是我需要知道的。如果可以,你能回答这个问题:我是否需要使用 DeleteObject 删除第二个中的 HBitmap?还是保持原样就可以了?此外,我将在 10 分钟内将您的答案标记为已接受,因为在那之前它不会让我接受。 是的,当然您需要致电DeleteObject
。不过,这与您问题中的其余代码无关。如果你调用LoadImage
,它成功了,那么你需要在某个时候释放结果。似乎这样做的地方是在类的析构函数中。【参考方案2】:
正确的语法是
struct Foo
Foo(char x, int y) : _xx, _y(y)
Foo(int y) : Foo('a', y)
char _x;
int _y;
;
您的第一个示例创建了一个立即销毁的临时对象。
【讨论】:
【参考方案3】:如果您想在一些命令式逻辑之后使用构造函数委托,您可以选择从临时移动分配*this
:
Foo()
// calculate stuff…
*this = Foo(stuff, calculated, above);
【讨论】:
【参考方案4】:使用初始化列表的第二个例子是正确的。 第一个示例最终会创建一个临时对象。
【讨论】:
以上是关于委托构造函数 C++的主要内容,如果未能解决你的问题,请参考以下文章