スーパークラスへのポインターを受け取り、その上で操作を実行する関数があります。ただし、ある時点で、関数は入力されたオブジェクトのディープコピーを作成する必要があります。そのようなコピーを実行する方法はありますか?
関数をテンプレート関数にして、ユーザーに型を渡してもらうことに気づきましたが、C++がより洗練されたソリューションを提供することを期待しています。
スーパークラスへのポインターを受け取り、その上で操作を実行する関数があります。ただし、ある時点で、関数は入力されたオブジェクトのディープコピーを作成する必要があります。そのようなコピーを実行する方法はありますか?
関数をテンプレート関数にして、ユーザーに型を渡してもらうことに気づきましたが、C++がより洗練されたソリューションを提供することを期待しています。
SpaceCowboyは慣用的clone
な方法を提案していますが、3つの重要な詳細を見落としていました。
class Super
{
public:
virtual Super* clone() const { return new Super(*this); }
};
class Child: public Super
{
public:
virtual Child* clone() const { return new Child(*this); }
};
clone
const
方法ですclone
基本クラスではなく、現在のクラスへのポインタを返しますclone
現在のオブジェクトのコピーを返します2つ目は非常に重要です。これは、単なる。よりも多くの型情報がある場合があるという事実から利益を得ることができるためですSuper*
。
また、私は通常clone
、同じタイプの新しいオブジェクトではなく、コピーを提供することを好みます。それ以外の場合は、Exemplar
パターンを使用して新しいオブジェクトを作成していますが、適切なクローンを作成しておらず、名前が誤解を招く可能性があります。
wxWidgetsで見た1つの例は、オーバーライドされたメソッド'clone'を定義して、各クラスで適切なディープコピーを作成できるようにすることですが、メソッドはそのコピーをスーパークラスとして返します。
(そして、例を挙げて他の答えがあります)