我试图使用重载运算符方法将一个队列的条目复制到另一个队列,但我的功能出错了。我不知道如何以下面的方式访问“原始”队列的值:
struct Node
{
int item;
Node* next;
};
class Queue
{
public:
// Extra code here
void operator = (const Queue &original);
protected:
Node *front, *end;
};
void Queue::operator=(const Queue &original)
{
//THIS IS WHERE IM GOING WRONG
while(original.front->next != NULL) {
front->item = original.front->item;
front->next = new Node;
front = front->next;
original.front = original.front->next;
}
}
答案 0 :(得分:3)
你有一个功能性的复制构造函数吗?如果是这样,我将根据您的复制构造函数实现赋值运算符,如下所示:
#include <algorithm> // <utility> for C++11
void Queue::operator=(const Queue &other)
{
// Assumes your only field is the "front" pointer.
Queue tmp(other); // May throw.
std::swap(front, tmp.front); // Will not throw.
}
这个想法是你执行任何可以抛出异常的操作(比如你对operator new()
的调用),这个临时对象会清理资源,然后通过交换“提交”你的更改非投掷操作中的内容,以便即使在构造Queue
期间抛出异常,tmp
的状态也是合理的。保证指针赋值不抛出,这就是为什么在这种情况下对std::swap()
的调用是非投掷的原因。在离开作业的范围后,运算符tmp
的析构函数应清理旧的链接列表,因为其front
已与旧的front
交换。
有关此“ copy-to-temporary-and-swap ”习惯用法的详细信息,请参阅GotW #59,以及它与强大的异常安全保证的关系。
答案 1 :(得分:2)
void Queue::operator=(const Queue &original)
{
Node* tmp = original.front;
//THIS IS WHERE IM GOING WRONG
while(tmp->next != NULL) {
front->item = tmp->item;
front->next = new Node;
front = front->next;
tmp = tmp->next;
}
}