2016-06-17 5 views
1

私は、多型実装クラスベースへのポインタが含まれている次のクラスAのコピーコンストラクタを実装したいです。現時点では、派生クラスがオーバーライドする必要がある、クラスBaseに仮想create_copy()メソッドがあります。ただし、派生クラスのオーバーライドはすべて同じコードを使用します。 A型のオブジェクトを簡単にコピーする方法がありませんか?そして、派生クラスごとにまったく同じコードを実際に複製する必要がありますか?以下は私が今使っているものです。それが答えを変える場合は、実行時の多型が必要です。私はいくつかのようなコードを使用して関与していた派生クラスのコピーコンストラクタを一般的に実装する方法は?

class A { 
public: 
    A(const A& a): base_p {a.base_p->create_copy()} {} 
private: 
    unique_ptr<Base> base_p; 
}; 

class Base { 
public: 
    virtual unique_ptr<Base> create_copy() const; 
}; 

class Derived : public Base { 
public: 
    unique_ptr<Base> create_copy() const override { 
    return make_unique<Derived>(*this); 
    } 
}; 

ひとつのアイデアは:

return make_unique<remove_reference_t<decltype(*this)>>(*this); 

しかし、このコードは、constメンバ関数では動作しません。また、decltype(* this)はコンパイル時に評価されるので、各派生クラスのcreate_copy()メソッドを明示的にオーバーライドしなければならないと思うので、そのコードを基底クラスメソッドに入れても良いことはありません。

編集: 答えはInheritance in curiously recurring template pattern polymorphic copy (C++)で、私が必要なものより複雑です。私は単純な深さ1の 継承階層を持っています。これは決して深い深さに拡張する必要はありません。 Iorroの答えは、私の問題を解決するのに十分であった。

+0

あなたは[この投稿]に興味があるかもしれません(https://stackoverflow.com/questions/196733/how-can-i-use-covariant-return-types-with-smart-pointers) – CoryKramer

+0

可能な[不思議な反復テンプレートパターン多型コピー(C++)における継承(http://stackoverflow.com/questions/9422760/inheritance-in-curiously-recurring-template-pattern-polymorphic-copy-c) –

+0

デザインに本当に必要なのは、 'unique_ptr'は、すべてのコピーでコンテンツがクローンされます! –

答えて

2
  • 中間BaseImplCopyテンプレートクラスを持っている(create_copyを実装)Tにとって
  • で、それはこれがCRTPと呼ばれる

  • ベース
  • からレッツ派生派生BaseImplCopyから派生作成し、広く使用されています。 BaseImplCopyでstatic_cast(this)を行う必要があるかもしれないことに注意してください。

    ところで、create_copy()は、従来から)(クローンと呼ばれています。

    +0

    http://stackoverflow.com/questions/12255546/c-deep-copying-a-base-class-pointer?rq=1 BaseCRTPを検索 – lorro

    +0

    ありがとうございました。私はこれを試してみましょう。 –

    +0

    それは魅力的に働いた:) –

    関連する問題