如何为具有自引用指针的类实现复制构造函数/赋值运算符?

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 以确保这不是问题。

以上是关于如何为具有自引用指针的类实现复制构造函数/赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

c++中拷贝构造函数和赋值运算符重载本质上一样么

c++ 拷贝构造函数与赋值运算符重载函数的区别是

为对象指针实现复制构造函数和运算符的正确方法是啥

具有不可复制成员的复制赋值运算符

返回对象和返回引用