我试图理解作者3.3.4 Suppressing Operations
在他的新书(TCPL 第 4 版)中的建议,但无济于事。
摘自书中
对层次结构中的类使用默认复制或移动通常是一场灾难:仅给定一个指向基类的指针,我们根本不知道派生类有哪些成员(第 3.3.3 节),所以我们不知道如何复制它们。所以,最好的办法通常是删除默认的复制和移动操作;也就是说,消除这两个操作的默认定义:
class Shape {
public:
Shape(const Shape&) =delete; // no copy operations
Shape& operator=(const Shape&) =delete;
Shape(Shape&&) =delete; //no move operations
Shape& operator=(Shape&&) =delete;
~Shape();
};
现在,编译器将捕获复制 Shape 的尝试。如果您需要在类层次结构中复制对象,请编写某种克隆函数(第 22.2.4 节)。
例如,下面的代码不能用 编译Shape(const Shape&) = delete;
,因为clone()
函数调用了Shape
的复制构造函数。
#include <iostream>
class Shape
{
public:
virtual ~Shape() {}
Shape() {}
Shape(const Shape&) {};
virtual Shape* clone() const = 0;
};
class Circle: public Shape
{
public:
Circle(int i) : a(i) {}
Circle* clone() const { return new Circle(*this); }
int a;
};
int main()
{
Shape* p = new Circle(1);
Shape* q = p->clone();
std::cout << dynamic_cast<Circle*>(p)->a << std::endl;
std::cout << dynamic_cast<Circle*>(q)->a << std::endl;
}