【发布时间】:2018-12-21 16:34:56
【问题描述】:
当我想要多态行为时,我经常发现自己在 C++ 中使用唯一指针。我通常会实现类似下面的纯抽象类:
class A {
public:
virtual A* clone() const = 0; // returns a pointer to a deep copy of A
// other methods go here
};
当我想用自己的 A 实例修饰另一个类时,clone 方法会派上用场,例如:
#include <memory>
class B {
private:
std::unique_ptr<A> a_ptr;
public:
// ctor
B(const A& a) {
a_ptr = std::unique_ptr<A>(a.clone());
//...
}
// copy ctor
B(const B& other) : B(*other.a_ptr) {}
};
我总是最终在 B 中实现复制构造函数以避免编译器错误(MSVC 给出了关于尝试引用已删除函数的模糊消息),由于唯一指针,这完全有意义。我的问题可以总结如下:
-
我真的需要 B 中的复制构造函数吗?也许有更好的模式可以让我完全避免它。
-
如果是 1,我可以停在那里吗?我是否需要实现其他默认功能? IE。在任何情况下我还需要默认构造函数和析构函数吗?
在实践中,每当我觉得需要实现默认函数时,我通常会在其他三个函数旁边实现一个移动构造函数;我通常使用复制和交换习语(根据GManNickG's answer in this thread)。我认为这不会改变任何事情,但也许我错了!
非常感谢!
【问题讨论】:
-
类拥有一个独特的资源。它不会因为编译器错误而违反规则 3(或 5)。但是,如果您需要缺少的方法提供的功能,您有 2 个选择:(1)将方法添加到每个类; (2) 编写一个
my_sort_of_unique_ptr类,该类实现一个复制构造函数,该构造函数可以进行克隆(您可能还需要移动)并使用它而不是std::unique_ptr -
谢谢理查德;我非常喜欢你的建议(2)。我认为定制的唯一指针类将是一个非常优雅的解决方案。
标签: c++ polymorphism unique-ptr