2012-04-09 3 views
0

Ich habe versucht, die Überladung-Operator-Methode zu verwenden, um die Einträge einer Warteschlange in eine andere zu kopieren, aber ich bin falsch mit meiner Funktion. Ich weiß nicht, wie sonst die Werte der Warteschlange Zugriff auf „Original“ eine andere Möglichkeit, als das, was ich unter:Operator Überladung für Warteschlange C++

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

Es gibt bereits eine Klasse 'std :: queue'. – Griwes

Antwort

1
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; 
    } 
} 
+0

Tue ich das nicht sowieso? – Josh

+0

Nein. Sie ändern immer Front in Ihrer Version. In der obigen Version wird vor dem Start geändert, aber nicht in der Schleife, so Front ändert sich nicht und zeigt auf den Anfang der Warteschlange. – Glenn

+0

Puh, ich dachte, dass die Idee einfach ist - es gibt Unterschiede in dem, was Sie verändern. In Ihrem Beispiel ändern Sie das Objekt als Referenz, in meinem Fall haben Sie Ihre eigene Variable, die Sie ändern können. – nothrow

3

Haben Sie eine funktionsfähige Kopie Konstruktor? Wenn ja, würde ich Ihren Zuweisungsoperator in Bezug auf Ihren Copykonstruktor implementieren wie folgt:

#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. 
} 

Die Idee ist, dass Sie alle Operationen ausführen, die eine Ausnahme auslösen kann (wie Ihr Anruf operator new()) auf der Seite in ein temporäres Objekt, das Ressourcen aufräumt und dann Ihre Änderungen "festschreibt", indem Sie den Inhalt in einer nicht auswerfenden Operation austauschen, sodass der Status von Queue normal ist, auch wenn während der Erstellung von tmp eine Ausnahme ausgelöst wird. Zeigerzuweisung ist garantiert nicht werfen, weshalb der Aufruf an std::swap() in diesem Fall nicht wirft. Wenn Sie den Bereich Ihres Zuweisungsoperators tmp verlassen, sollte der Destruktor Ihre alte Linkliste bereinigen, da ihre front mit Ihrer alten front getauscht wurde.

Siehe GotW #59 für Details über diese "Kopie-zu-temporäre-und-Swap-" Idiom, und wie es sich auf die starke Ausnahme Sicherheitsgarantie bezieht.