問題は次のとおりです。基本クラスを指すunique_ptrのディープクローンと、基本クラスにいくつかの仮想関数があります。ディープクローンで基本クラスを指すunique_ptr
詳細コード:私は深いコピーをしたい場合は、コピーコンストラクタで
class QueryRewrite {
public:
QueryRewrite(bool wasRes, ReturnMeta rmeta, const KillZone &kill_zone,
AbstractQueryExecutor *const executor)
: rmeta(rmeta), kill_zone(kill_zone),
executor(std::unique_ptr<AbstractQueryExecutor>(executor)) {}
QueryRewrite(const QueryRewrite &other_qr)
: rmeta(other_qr.rmeta), kill_zone(other_qr.kill_zone),
executor(other_qr.executor.get()) {}
QueryRewrite(){}
QueryRewrite(QueryRewrite &&other_qr) : rmeta(other_qr.rmeta),
executor(std::move(other_qr.executor)) {}
const ReturnMeta rmeta;
const KillZone kill_zone;
std::unique_ptr<AbstractQueryExecutor> executor;
};
QueryRewrite(const QueryRewrite &other_qr)
: rmeta(other_qr.rmeta), kill_zone(other_qr.kill_zone),
executor(other_qr.executor.get()) {}
executor(other_qr.executor.get())
は、コードを変更する方法を、エグゼキュータにちょうど浅いコピーです?
error: cannot allocate an object of abstract type ‘AbstractQueryExecutor’
note: because the following virtual functions are pure within ‘AbstractQueryExecutor’:
:
そしてexecutor
はAbstractQueryExecutor
は、いくつかの仮想関数を持つ基本クラスですので、私は executor(new AbstractQueryExecutor(other_qr.executor.get()))
にコードを変更した場合、それはのようなものを言うだろうAbstractQueryExecutor
のインスタンスをポイントし、unique_ptrをあります
Cが 'unique_ptr'を導入し、それらを動作させるために必要なすべての基盤を導入しました!クール! – StoryTeller
http://stackoverflow.com/questions/16030081/copy-constructor-for-a-class-with-unique-ptr – Rishi
'unique_ptr'は本当に問題に関連していません。これは多相コピーの古典的な問題であり、通常は仮想 'clone()'メンバ関数によって解決されます。 – Angew