您如何为包含shared_ptr的类创建复制构造函数/赋值运算符? C ++

问题描述 投票:0回答:3

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

我有两个成员函数,默认名称设置为Ninja master,disple_ child设置为nullptr

下面是我班上公共/私人的摘录:

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
}
c++ class constructor deep-copy
3个回答
0
投票

深层复制构造函数的示例:

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

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

如果不需要deep副本,则只需省略副本构造器。它会隐式定义,并会自动复制shared_ptr

我不了解的用法?三元运算符。请解释。

我们首先在check中,shared_ptr存储了一个非空指针。如果是,我们将其复制为dereference,并使用Ninja的副本构造函数创建一个新的副本,否则将创建一个空的shared_ptr。如果disciples_在设计上永远不会为空,则可以忽略此检查。


1
投票

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

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


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

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

0
投票

您可以执行以下操作-

  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_;
    }   
© www.soinside.com 2019 - 2024. All rights reserved.