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

How to implement a copy constructor / assignment operator for a class that has a self-referential pointer?

提问人:LinearM 提问时间:2/11/2019 更新时间:2/11/2019 访问量:121

问:

我不太确定是否可以实现复制构造函数/赋值运算符,因此,如果我希望这个类等于另一个 bags 实例,它将用该实例替换自己。

我已经尝试了一般赋值运算符实现(检查自引用等)。

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;
}

袋子是苹果(派生)的基类。我希望能够让袋子装自己和苹果。

C++ C++11 模板 复制构造函数 值运算符

评论

1赞 Phil1970 2/11/2019
正如所写的那样,你的问题和你的代码没有多大意义。此外,复制指针不会调用类的复制构造函数,而只会复制指针值。如果一个对象包含指向其自身类型的对象的指针,那么实质上,您有一个链表。在这一点上,你想要深度复制吗?

答:

4赞 R Sahu 2/11/2019 #1

没有必要使用

bags<T> * self;

总是有提供的语言。如果出于某种原因必须使用,请将其设为成员函数。thisself

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.

评论

0赞 LinearM 2/11/2019
因此,如果我想将袋子的实例设置为另一个实例。我只需在复制构造函数中执行 *this = *(b.self) 吗?当前实例是否包含来自 b 的所有数据?
0赞 R Sahu 2/11/2019
@LinearM,大多数时候是的。如果 (a) 您的类分配和取消分配内存,并且 (b) 您尚未实现自定义函数,则答案是否定的。请遵循三法则,以确保这不是问题。operator=