如何为包含 shared_ptr 的 class 创建复制 constructor/assignment 运算符? C++

How do you make a copy constructor/assignment operator for a class that contains a shared_ptr? C++

说,我有一个名为 Ninjaclass.h 的文件

我有两个成员函数,默认名字设置为Ninja master,discple_child设置为nullptr

下面是我的 class 的 public/private 的片段:

private:

    std::string name_;
    std::shared_ptr<Ninja> disciples_;


  public:
    Ninja(std::string name = "Ninja Master")
      : name_{name},
        disciples_{std::shared_ptr<Ninja>(nullptr)}
     {}
    ~Ninja() = default;     
Ninja(const Ninja& copy2);  //trying to make a copy constructor here
Ninja& operator=(const Ninja&);   // I also need help creating an assignment operator too 

我想创建一个深拷贝构造函数,但出现错误。

下面是 .cpp 文件中我的深层复制构造函数的代码段。

Ninja::Ninja(const Ninja& copy2) {
   Ninja a();
   a = copy2; //error cannot convert const Ninja to Ninja() in assignment
}

Ninja a(); 声明一个函数。

如果要创建 Ninja 对象,请去掉括号:Ninja a;


复制构造函数可以这样实现:

Ninja::Ninja(const Ninja &n)
:   name_(n.name_),
    disciples_(n.disciples_)
{
}

一个深拷贝构造函数的例子:

Ninja(const Ninja& other) 
    : name_(other.name_), 
      disciples_(other.disciples_ ? 
          std::make_shared<Ninja>(*other.disciples_) : 
          std::shared_ptr<Ninja>{}
      )
{}

它将创建一个 new shared_ptr,它将保存 other.disciples_ 管理的 Ninja 对象的副本。

如果不需要 deep 副本,只需省略复制构造函数即可。它将被隐式定义并自动复制 shared_ptr

I don't understand the usage of the ? ternary operator. Please explain.

我们首先check that shared_ptr stores a non-null pointer. If it does, we dereference它并使用Ninja的复制构造函数创建一个新的,如果没有,我们创建一个空的shared_ptr。如果 disciples_ 按照设计永远不会为空,则可以省略此检查。

您可以执行如下操作 -

  if( copy2.disciples_ )
    {   
        this->disciples_ = make_shared<Ninja>();
        this->disciples_->name_ = copy2.disciples_->name_;
        this->disciples_->disciples_= copy2.disciples_->disciples_;
    }   
    else
    {   
        this->disciples_ = copy2.disciples_;
    }