0

作成中のオブジェクトのデータ メンバーを初期化するコピー コンストラクターがコードで定義されています。いくつかの変数の値を変更する必要がある場合は、新しいコピー ctor を作成しています。したがって、私の質問は、同じコードを再度記述する代わりに、特定の異なるデータ メンバーを初期化することはできますか?

例: すでに存在する

A::A(const A& cpy)
{ 
 a=cpy.a;
 b=cpy.b;
 c=cpy.c
}

今、私は自分のctorを次のように書きたい

A::A(const A& cpy, bool x)
{
   if( x)
      a=something;
   else
      a =cpy.a
   //call first ctor for other variables (b and c)
}

ありがとうルチ

4

4 に答える 4

1

C++11以降、次のようなことができます:

class A 
{
    public:

          A(const A& cpy) { a=cpy.a; b=cpy.b; c=cpy.c; }  
          A(const A& cpy, bool x): A(cpy) { a = something_else; }  
}
于 2012-07-27T09:57:07.950 に答える
1

C++11 では、初期化子リストでコンストラクターを呼び出すことができます。

class Foo
{
public:
    Foo(int a) {}
    Foo(int a, int b) : Foo(a) {}
};

ただし、コードに問題があります。つまり、余分な引数を取るコピー コンストラクターを作成しようとしています。これはもはやコピー コンストラクターではなく、2 つの引数を取る通常のコンストラクターです。

于 2012-07-27T09:59:54.270 に答える
0

コピーコンストラクターにデフォルトの引数を指定することでそれを行うことができます

A::A(const A& cpy, bool x = false)
{
   if( x)
      a=something;
   else
      a =cpy.a
   //call first ctor for other variables (b and c)
}

あなたはそれを呼び出すことができます

A objA;
 A b(objA, true);       // b gets a shallow copy of a
于 2012-07-27T09:59:00.567 に答える
0

コピー コンストラクターには、さらに引数がデフォルト設定されている場合があります。

A::A(A const & rhs, bool x = false)
{
    a = x ? FOO : BAR;
}

多分それはあなたのコードを簡潔に書くのに役立ちます...

于 2012-07-27T09:59:13.747 に答える