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 (将#修改为@)