如何为包含 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_;
}
说,我有一个名为 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_;
}