Queue C ++的运算符重载

时间:2012-04-09 23:25:22

标签: c++ class queue operator-overloading

我试图使用重载运算符方法将一个队列的条目复制到另一个队列,但我的功能出错了。我不知道如何以下面的方式访问“原始”队列的值:

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

2 个答案:

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