55

私はこれを正しく行っていますか?基本的に同じコードが 3 回繰り返されるため、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))
{
}
4

4 に答える 4

46

2番目を行う必要があります。コンストラクターの委任は、コンストラクターの初期化リストでのみ機能します。それ以外の場合は、一時的なものを作成するか、言及したような他の間違いを犯します。

于 2012-12-19T20:59:05.540 に答える
45

正しい構文は次のとおりです。

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

  char _x;
  int _y;
};

最初の例では、すぐに破棄される一時的なものを作成します。

于 2012-12-19T20:59:24.310 に答える