次のクラスを検討してください。
class A {
char *p;
int a, b, c, d;
public:
A(const &A);
};
"p" のディープ コピーを行うには、コピー コンストラクターを定義する必要があることに注意してください。これには 2 つの問題があります。
ほとんどのフィールドは単純にコピーする必要があります。それらを 1 つずつコピーするのは見苦しく、エラーが発生しやすくなります。
さらに重要なことに、新しい属性がクラスに追加されるたびに、コピー コンストラクターを更新する必要があり、メンテナンスの悪夢が生まれます。
私は個人的に次のようなことをしたいと思っています:
A(const A &a) : A(a)
{
// do deep copy of p
:::
}
したがって、デフォルトのコピー コンストラクターが最初に呼び出され、次にディープ コピーが実行されます。
残念ながら、これはうまくいかないようです。
これを行うより良い方法はありますか?1 つの制限 - 共有/スマート ポインターを使用できません。
Sbi の提案は非常に理にかなっています。リソースを処理するためのラッパー クラスを作成すると思います。ブースト ライブラリはすべてのプラットフォームで利用できるとは限らないため、shared_ptr を使用したくありません (少なくとも標準ディストリビューションでは利用できません。OpenSolaris はその例です)。
何らかの方法でコンパイラにデフォルトのコンストラクタ/代入演算子を作成させ、その上に機能を追加することができれば素晴らしいと思います。手動で作成されたコピー コンストラクター/代入演算子関数は、作成するのが面倒で、維持するのは悪夢だと思います。したがって、私の個人的な経験則は、カスタム コピー コンストラクター/代入演算子を絶対に避けることです。
皆さんの回答と役立つ情報に感謝し、私の質問のタイプミスについて申し訳ありません. 携帯から入力していました。