1. ホーム
  2. c++

[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?

2022-02-12 12:16:14

質問

として C# 私はコンストラクタを使いこなすことに慣れました。

class Test {
    public Test() {
        DoSomething();
    }

    public Test(int count) : this() {
        DoSomethingWithCount(count);
    }

    public Test(int count, string name) : this(count) {
        DoSomethingWithName(name);
    }
}

C++でこれを実現する方法はありますか?

クラス名を呼び出したり、'this'キーワードを使ったりしてみましたが、どちらも失敗します。

どうすればいいですか?

C++11: Yes!

C++11以降では、これと同じ機能( 委譲コンストラクタ ).

C#とは若干構文が異なります。

class Foo {
public: 
  Foo(char x, int y) {}
  Foo(int y) : Foo('a', y) {}
};

C++03:いいえ

残念ながら、C++03ではこれを実現する方法はありませんが、2つの方法でシミュレーションすることができます。

  1. デフォルトのパラメータを介して、2つ(以上)のコンストラクタを結合することができます。

    class Foo {
    public:
      Foo(char x, int y=0);  // combines two constructors (char) and (char, int)
      // ...
    };
    
    
  2. initメソッドを使用して、共通のコードを共有します。

    class Foo {
    public:
      Foo(char x);
      Foo(char x, int y);
      // ...
    private:
      void init(char x, int y);
    };
    
    Foo::Foo(char x)
    {
      init(x, int(x) + 7);
      // ...
    }
    
    Foo::Foo(char x, int y)
    {
      init(x, y);
      // ...
    }
    
    void Foo::init(char x, int y)
    {
      // ...
    }
    
    

参照 C++FAQの項目 を参照してください。