1

いくつかのフィールドを持つ構造体があり、おそらくそれらをいじり回す(追加、削除)としましょう。

struct Something
{
 int number;
 int stuff[4];

 //... many other things

 Something(const Something& something, int newnumber) : number(newnumber)
 {
  //is there any way to default the rest to copy?
 }
};

私は(デフォルトを使用して)コピーコンストラクターを宣言していないので、明らかに基本的なケース(ポインターなどなし)を処理します。ただし、1つの変更を加えて構造体をコピーできるようにもしたいと思います。つまり、初期化リストにコピーするすべてのものを入力し、構造体の内容が変更されるたびに変更する必要があるということです。私の宣言されていないコピーコンストラクターは、私の側の介入なしに変更を便利に処理しますが。

そのデフォルトのコピーコンストラクターを利用して、構造体の内容をいじるたびに「1回の変更でコピー」コンストラクターを変更する必要がないようにする方法はありますか?

編集:コンストラクターの委任により、次のエラーが発生します。

Something(const Something& something, int newnumber) : Something(something), number(newnumber) {}

委任コンストラクターの呼び出しは、唯一のメンバー初期化子
'番号'である必要があります:すでに初期化されています

4

2 に答える 2

1

残念ながら、デフォルトの構築コードを別の関数に分割し、それとコピー コンストラクターの両方から呼び出さない限り、できません。

ただし、構築委譲は c++11にあります。

于 2013-02-03T22:10:24.077 に答える
1

委任コンストラクターへの呼び出しは、唯一のメンバー初期化子でなければなりません

デフォルトのコンストラクターが既に初期化しているため、それを行うことはできません。したがって、 2 回number初期化することになります。numberあなたができる最善のことは、番号(新しい番号)をctorの本体内に移動することですnumber = newnumber;。原則として、ほとんどの引数を使用してコンストラクターにロジックを配置し、他のすべてのコンストラクターをそれに委譲する必要があります (おそらく、これはあなたの例では不可能です)。

于 2013-02-04T03:33:31.777 に答える