Delegate Constructor C++

C++C++11

C++ Problem Overview


Am I doing this right? I'm trying to delegate a C++ class constructor as it's basically the same code repeating 3 times.. I read up on C++x11 and read that g++ 4.7.2 allows this but I'm not sure if I'm doing it right:

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?
}

OR do I need to do:

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))
{
}

C++ Solutions


Solution 1 - C++

You need to do the second. Delegating constructors only works in the constructor's initialization list, otherwise you'll just create a temporary or do other mistakes like you mentioned.

Solution 2 - C++

The correct syntax is

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

  char _x;
  int _y;
};

Your first example creates a temporary that is destroyed right away.

Solution 3 - C++

If you want to use constructor delegation after some imperative logic, you can opt to move-assign *this from a temporary:

Foo() {
  // calculate stuff…
  *this = Foo(stuff, calculated, above);
}

Solution 4 - C++

The second example using the initializer list is the correct one . First example is going to end up creating a temporary object.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrandonView Question on Stackoverflow
Solution 1 - C++PubbyView Answer on Stackoverflow
Solution 2 - C++log0View Answer on Stackoverflow
Solution 3 - C++ThatsJustCheesyView Answer on Stackoverflow
Solution 4 - C++rahulView Answer on Stackoverflow