3

スーパークラスへのポインターを受け取り、その上で操作を実行する関数があります。ただし、ある時点で、関数は入力されたオブジェクトのディープコピーを作成する必要があります。そのようなコピーを実行する方法はありますか?

関数をテンプレート関数にして、ユーザーに型を渡してもらうことに気づきましたが、C++がより洗練されたソリューションを提供することを期待しています。

4

2 に答える 2

12

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); }
};
  1. cloneconst方法です
  2. clone基本クラスではなく、現在のクラスへのポインタを返します
  3. clone現在のオブジェクトのコピーを返します

2つ目は非常に重要です。これは、単なる。よりも多くの型情報がある場合があるという事実から利益を得ることができるためですSuper*

また、私は通常clone、同じタイプの新しいオブジェクトではなく、コピーを提供することを好みます。それ以外の場合は、Exemplarパターンを使用して新しいオブジェクトを作成していますが、適切なクローンを作成しておらず、名前が誤解を招く可能性があります。

于 2010-06-17T17:09:01.200 に答える
2

wxWidgetsで見た1つの例は、オーバーライドされたメソッド'clone'を定義して、各クラスで適切なディープコピーを作成できるようにすることですが、メソッドはそのコピーをスーパークラスとして返します。

(そして、例を挙げて他の答えがあります)

于 2010-06-17T16:29:09.440 に答える