委托构造函数 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++的主要内容,如果未能解决你的问题,请参考以下文章

github上的每日学习 10

使用受保护构造函数和复制构造函数创建 C++ 非堆工厂对象

委托构造函数详解,小白也可以看懂

[C++11 类的改进] --- 继承构造函数和委托构造函数

使用虚拟继承和委托构造函数在构造函数中崩溃

[C++11]委托构造函数