【发布时间】:2017-02-22 08:30:20
【问题描述】:
问题是:如何对指向基类的 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())只是对执行器的浅拷贝,如果我想做深拷贝,代码怎么改?
而executor 是一个unique_ptr,它指向AbstractQueryExecutor 的一个实例,AbstractQueryExecutor 是一个具有一些虚函数的基类,所以如果我将代码更改为
executor(new AbstractQueryExecutor(other_qr.executor.get())),它会说:
error: cannot allocate an object of abstract type ‘AbstractQueryExecutor’
note: because the following virtual functions are pure within ‘AbstractQueryExecutor’:
【问题讨论】:
-
C 介绍了
unique_ptr以及使它们工作所需的所有基础!?酷! -
unique_ptr与问题没有真正的关系。这是多态复制的经典问题,通常由一个虚拟的clone()成员函数来解决。 -
executor(other_qr.executor.get())不是浅拷贝,它创建了一个指针,两个不同的unique_ptrs 都认为他们唯一拥有。这不好。
标签: c++ constructor abstract-class unique-ptr