说,我有一个名为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
}
深层复制构造函数的示例:
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_
在设计上永远不会为空,则可以忽略此检查。
[Ninja a();
声明一个函数。
如果要创建Ninja
对象,请放括号:Ninja a;
复制构造函数可以这样实现:
Ninja::Ninja(const Ninja &n)
: name_(n.name_),
disciples_(n.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_;
}