微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 重载 operator= 无法正常工作

如何解决C++ 重载 operator= 无法正常工作

我正在用 C++ 开发自定义队列列表类。
在我的主要我有

  QueueLst<int> q1;
  q1.Enqueue(1);
  q1.Enqueue(2);
  q1.Enqueue(3);
  cout<<q1.HeadAndDequeue()<<" "<<q1.HeadAndDequeue()<<" "<<q1.HeadAndDequeue();

效果很好,结果:

1 2 3

现在如果我写;

  QueueLst<int> q1;
  q1.Enqueue(1);
  q1.Enqueue(2);
  q1.Enqueue(3);
  QueueLst<int> q2;
  q2 = q1;
  cout<<q2.HeadAndDequeue()<<" "<<q2.HeadAndDequeue()<<" "<<q2.HeadAndDequeue();

输出

1
terminate called after throwing an instance of 'std::length_error'
  what():  List is empty!

这是我的 operator= 方法

template <typename Data>
QueueLst<Data>& QueueLst<Data>::operator=(const QueueLst& tocopy){
   QueueLst<Data>* tmp = new QueueLst<Data>(tocopy);
   std::swap(*this,*tmp);
   delete tmp;
   return *this;
}

而且我 100% 确定复制构造函数工作正常,事实上,如果我写

template <typename Data>
QueueLst<Data>& QueueLst<Data>::operator=(const QueueLst& tocopy){
   QueueLst<Data>* tmp = new QueueLst<Data>(tocopy);
   return *tmp;
}

效果很好!所以 std::swap 中有一些奇怪的东西,但是如何呢? 很抱歉,这是一个非常具体的问题,但不知道如何解决,谢谢。
更新 QueueLst 的定义:

#include "../queue.hpp"
#include "../../list/list.hpp"

namespace lasd {

template <typename Data>
class QueueLst :  virtual public Queue<Data>,virtual protected List<Data>{ // Must extend Queue<Data> and List<Data>

private:

protected:

  using List<Data>::head;
  using List<Data>::tail;
  using List<Data>::size;
  using typename List<Data>::Node;

public:

  // Default constructor
  QueueLst() = default;


  // Specific constructor
  QueueLst(const LinearContainer<Data>&); // A queue obtained from a LinearContainer


  // copy constructor
  QueueLst(const QueueLst&);

  // Move constructor
  QueueLst(QueueLst&&) noexcept;


  // Destructor
  ~QueueLst();


  // copy assignment
  QueueLst& operator=(const QueueLst&);

  // Move assignment
  QueueLst& operator=(QueueLst&&) noexcept;


  // Comparison operators
  bool operator==(const QueueLst&) const noexcept;
  bool operator!=(const QueueLst&) const noexcept;


  // Specific member functions (inherited from Queue)

  void Enqueue(const Data&) override; // Override Queue member (copy of the value)
  void Enqueue(Data&&) override; // Override Queue member (move of the value)
  Data& Head() const override; // Override Queue member (must throw std::length_error when empty)
  void Dequeue() override; // Override Queue member (must throw std::length_error when empty)
  Data HeadNDequeue() override; // Override Queue member (must throw std::length_error when empty)


  // Specific member functions (inherited from Container)

  void Clear() override; // Override Container member

};

}

#include "queuelst.cpp"

#endif

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。