4

C++ では、Java がコンストラクターへの呼び出しを処理する方法をエミュレートしようとしています。私の Java コードでは、2 つの異なるコンストラクターがあり、一方が他方を呼び出すようにしたい場合は、単純にthisキーワードを使用します。例:

public Constructor1(String s1, String s2)
{
    //fun stuff here
}

public Constructor2(String s1)
{
    this("Testing", s1);
}

このコードでは、Constructor2 (単一の文字列を渡す) でオブジェクトをインスタンス化することにより、Constructor1 を呼び出すだけです。これはJavaではうまく機能しますが、C++で同様の機能を得るにはどうすればよいですか? thisキーワードを使用すると、文句を言って教えてくれ'this' cannot be used as a functionます。

4

5 に答える 5

9

これは、コンストラクターの委任を使用して C++11 で可能になります。

class Foo {
public:
    Foo(std::string s1, std::string s2) {
        //fun stuff here
    }

    Foo(std::string s1) : Foo("Testing", s1) {}
};
于 2011-07-13T15:55:03.617 に答える
5

init以下に示すように、そのようなジョブのプライベート メンバー関数を作成できます。

struct A
{
   A(const string & s1,const string & s2)
   {
       init(s1,s2);
   }
   A(const string & s)
   {
      init("Testing", s);
   }
private:

   void init(const string & s1,const string & s2)
   {
         //do the initialization
   }

};
于 2011-07-13T15:39:16.193 に答える
3

これは C++ では実現できません。回避策は、既定のパラメーターを使用して単一のコンストラクターを作成することです。

例えば

class Foo {
    public:
       Foo(char x, int y=0);  // this line combines the two constructors
       ...
 }; 

または、共通コードを含む別のメソッドを使用することもできます。次に、2 つのコンストラクターで、適切な引数を指定してヘルパー メソッドを呼び出します。

于 2011-07-13T15:38:48.050 に答える
1

あなたが探しているのは、コンストラクターのオーバーロードと呼ばれます

于 2011-07-13T15:38:11.300 に答える
-1

別の方法:

Foo(int a){ *this = Foo(a,a); }
Foo(int a, int b): _a(a), _b(b){}

効率的ではありませんが、必要なものに似ています。ただし、上記のオプションの方が(効率の点で)優れているため、このオプションはお勧めしません。これを投稿して、別の方法を示しました。

于 2011-07-13T15:50:05.647 に答える