c++ - 如何实现 Cloneable 类?

标签 c++ design-patterns

<分区>

class Cloneable
{
 public:
   virtual Cloneable* clone() const = 0; //return copy of itself
   virtual ~Cloneable() {}
};

class A
{
 public:
   A(const A& a);    
   ~A();  

 private:
   Cloneable* b;
   Cloneable* c;
   std::string* s;     
};

A::~A()  
{
 delete b;
 delete c;
 delete s;
}

请帮助我理解可克隆模式。我不明白如何实现类 A 的构造函数、复制构造函数以及如何使用它们?

最佳答案

您首先需要区分复制构造函数和克隆模式。

复制构造函数是创建类拷贝的构造函数。

MyClass a;
MyClass copy(a); // calls the copy constructor

您(通常)不需要自己实现它,编译器会为您创建一个所谓的隐式复制构造函数。但是,如果您需要实现(例如,因为您编写了一个管理资源的类),请考虑五规则 ( Rule-of-Three becomes Rule-of-Five with C++11? )。

复制构造函数不是虚拟的(事实上,构造函数永远不是虚拟的)。

克隆模式的一个典型用例是这样的:

#include <memory>
class MyAbstractClass {
  virtual void someFunction();
};
class MyHeir : public MyAbstractClass {
  virtual void someFunction() override { /* TODO */ }
};
class MyHeir2 : public MyAbstractClass {
  virtual void someFunction() override { /* TODO */ }
};
std::unique_ptr<MyAbstractClass> ptr1 = std::make_unique<MyHeir>();
std::unique_ptr<MyHeir> clone; // TODO: clone

编译器无法在编译时知道 ptr1 是否包含 MyHeirMyHeir2 的实例。这就是您需要克隆模式的原因。您基本上只是实现了一个复制类的虚函数(阅读:调用复制构造函数)。

// in MyAbstractClass
virtual MyAbstractClass* clone() = 0;
// in MyHeir
virtual MyHeir * /* return type covariance */ clone() {
  return new MyHeir(*this); // call to the (implicit) copy constructor
}
// in MyHeir2
virtual MyHeir2 * /* return type covariance */ clone() {
  return new MyHeir2(*this);
}

现在您可以:

std::unique_ptr<MyHeir> clone = ptr1->clone();

关于c++ - 如何实现 Cloneable 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38241584/

相关文章:

c++ - 两个类通过散列模板特化相互引用

c++ - 根据索引值提取特定字节

c++ - 在 QueryParser 中解析非字母数字字符

java - Java Server 启动时服务运行的设计

algorithm - 为不同类型实现价格矩阵

java - 在java中传递一个抽象类而不是一个对象?

c++ - FFTW 函数 n2fv_64

c++ - 为什么此代码在具有多字节字符集但不具有 unicode 字符集的 visual studio 中完美运行?

c# - 可以处理错误的组件的异常或返回状态

c# - 为什么要为这个配置类创建一个接口(interface)呢?