如何解决C++ 重载 operator= 无法正常工作
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 举报,一经查实,本站将立刻删除。