如何为具有自引用指针的类实现复制构造函数/赋值运算符?
Posted
技术标签:
【中文标题】如何为具有自引用指针的类实现复制构造函数/赋值运算符?【英文标题】:How to implement a copy constructor / assignment operator for a class that has a self-referential pointer? 【发布时间】:2019-07-04 09:33:49 【问题描述】:我不太确定是否可以实现复制构造函数/赋值运算符,所以如果我希望这个类等于另一个包实例,它会用那个实例替换自己。
我已经尝试过一般的赋值运算符实现(检查自引用等)。
template <typename T>
class bags
public:
bags(const bag<T>& b)
bags<T>& operator=(bags<T> const &b)
private:
bags<T> * self;
template <typename T>
class apples : public bags<T>
public:
void test ()
self = new bags<T>; // this will invoke assignment operator
private:
bags<T> * self;
Bags 是 apples 的基类(派生的)。我希望能够有袋子包含自己和苹果。
【问题讨论】:
正如所写,您的问题和您的代码没有多大意义。同样复制指针不会调用类的复制构造函数,而只会复制指针值。如果一个对象包含一个指向它自己类型的对象的指针,那么本质上,你有一个单链表。到那时,你想要深拷贝吗? 【参考方案1】:没有必要使用
bags<T> * self;
始终提供this
的语言。如果出于某种原因必须使用self
,请将其设为成员函数。
bags<T> const* self() const
return this;
bags<T>* self()
return this;
另一种选择是使用函数局部变量。
bags<T> const* self = this; // In const member functions.
bags<T>* self = this; // In non-const member functions.
【讨论】:
所以如果我想将包的一个实例设置为另一个实例。我只是在复制构造函数中做 *this = *(b.self) ?当前实例是否拥有来自 b 的所有数据? @LinearM,大多数时候是的。如果(a)您的类分配和取消分配内存并且(b)您尚未实现自定义operator=
函数,则答案是否定的。请关注The Rule of Three 以确保这不是问题。以上是关于如何为具有自引用指针的类实现复制构造函数/赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章