当我有多态指针时使用 "rule of zero"

Using "rule of zero" when I have pointers for polymorphism

对于 "rule of zero",我明白我想将数据管理分成简单的 classes 实施规则 3,规则 5,等等,这样越复杂 classes 可以使用自动提供的构造函数、赋值运算符等。

当 class 成员由于多态性而必须是指针时,这是如何工作的?

例如,假设我有一个 class

class MyClass{
private:
 s_array<int> mynumbers;
 s_array<double> mydoubles;

 Base * object;
 ...
 };

这里,Base是一个基class,有多个派生classes,object可能指向其中一个派生classes .所以object是一个指针,为了得到多态性

如果不是因为 Base 指针的存在,假设 s_array<> 已正确实施,我可以对 MyClass 使用零规则。有没有一种方法可以让 MyClass 可以使用零规则,即使对象是一个指针?我想要复制的行为是 MyClass 的新实例获取指向 object.

的新副本的指针

如果你想用指针应用0规则,你需要使用共享指针:

shared_ptr<Base> object; 

但这并不能完全满足您的要求。因为 shared_ptr 将提供规则 5,但复制的指针将始终指向同一个原始对象。

要获得所需的行为,您需要创建自己的智能指针以提供 3 或 5 的规则。

如果多个 MyClass 对象可以指向同一个 Base 对象,那么只需使用 std::shared_ptr<Base> 而不是 Base* 作为您的 object 成员,因为提到了其他响应者。

但是,如果每个 MyClass 对象都需要指向它自己的 Base 对象,那么您别无选择,只能在 MyClass 中实施 3/5 规则,以便它可以创建自己的 Base 对象 and/or 从另一个 MyClass 对象克隆一个 Base 对象。

记录一下,我解决这个问题的方法如下(基本上按照上面的建议):

template <class myClass>
class clone_ptr
{
public:
  clone_ptr(){location=nullptr;}
  clone_ptr(myClass* d) { location = d;}  
  ~clone_ptr() { delete location; } 

  clone_ptr(const clone_ptr<myClass>& source){
    if (source.location!=nullptr){
      location=source.location->Clone();
    }
    else
      location=nullptr;
  }
  clone_ptr& operator= (const clone_ptr<myClass>& source){
    if (&source!=this){
      if (source.location!=nullptr){
    location=source.location->Clone();
      }
      else
    location=nullptr;
    }
    return *this;
  }

  myClass* operator->() { return location; }
  myClass& operator*() { return *location; }

private:
  myClass* location;
};

我在适当的 类 中实现了 Clone() 函数,如下所示:

class myClass : public parentClass{
...
 public:
   myClass* Clone() 
   {
     return new myClass(*this);
   }