2016-10-16 5 views
-1

Ich habe Probleme, meinen Kopf um das Konzept eines Zuweisungsoperators zu wickeln oder zumindest erfolgreich zu erstellen.Zuweisungsoperator für doppelt verknüpfte Liste in C++

Kopieren Konstruktoren sind kein Problem für mich; hier ist mein, dass seine Arbeits:

//copy constructor 
Set::Set(const Set &rhs){ 
    _head = rhs._head; 
    _tail = rhs._tail; 

    //null, basically this object is 0 
    if(rhs._head == NULL){ 
     _head = NULL; 
     _tail = NULL; 
     _size = 0; 
    }else{ 
     _head = new Elem(*rhs._head); 
     _tail = new Elem(*rhs._tail); 
     _size = rhs._size; 

     Elem *prev = NULL; 
     Elem *curr = _head; 
     Elem *otherCurr = rhs._head; 
     int counter = 0; 
     while(otherCurr->next != NULL){ 
      curr->next = new Elem(*otherCurr->next); 
      curr->next->prev = curr; 


      curr = curr->next; 
      otherCurr = otherCurr->next; 
     } 

     //now that we are done lets setup the tail 
     _tail->prev = curr; 
     curr->next = _tail; 

    } 

} 

I Beispiel-Code las, und sah einige Leute die #include <algorithm> Bibliothek verwendet, sie umzusetzen. Ich habe das stattdessen versucht, scheint aber überhaupt nicht zu funktionieren.

//assignment operator 
Set& Set::operator=(const Set &rhs){ 
    Set temp(rhs); 
     std::swap(temp._head,_head); 
     std::swap(temp._tail, _tail); 
     return *this; 

} 

Dieser obige Code funktioniert jedoch nicht korrekt. Wirklich kämpfen um das Konzept zu verstehen, wie Zuweisungsoperatoren gemacht werden. Ich dachte, es würde im Prinzip genauso funktionieren, wie du Werte von einem in einen anderen kopieren willst. Aber offensichtlich nicht. Wenn mir jemand Tipps geben könnte, wie es funktioniert, wäre das großartig.

Nur einige allgemeine Informationen über meine Klasse, gibt es a _head und a _tail, die auf den Anfang und das Ende der Liste zeigt. Dummy-Elemente.

Hier ist, wie das Objekt aufgebaut:

struct Elem { 
     ELEMENT_TYPE info; 
     Elem *prev, *next; 
    }; 
    Elem *_head, *_tail; 
    int _size; 
+0

Nach unten und schließen Abstimmung für Nein [MCVE]. Zum Thema: Die ganze Welt des Potentials ist hier im Kopierkonstruktor verletzt: '_head = rhs._head; _tail = rhs._tail; 'Off-Thema: Achten Sie auf Unterstrichpräfixe. Sie sind im Allgemeinen für die interne Bibliotheksnutzung reserviert. Sie sollten hier sicher sein, aber tun Sie das im globalen Rahmen oder folgen Sie diesem Unterstrich mit einem Großbuchstaben und Sie könnten sich in Schwierigkeiten finden. – user4581301

+0

Seufz, danke für den Downvote. Große Hilfe –

+0

Warum implementieren Sie eine verknüpfte Liste manuell anstelle von 'std :: list'? –

Antwort

0

ich zwei Probleme mit Ihrem Copykonstruktor sehe (und nicht einmal versuchen, weiter zu graben):

  1. Was ist der Zweck des Schwanzes? Es scheint nicht benötigt zu werden oder wird nicht korrekt verwendet.
  2. Ihre Kopierschleife scheint auf anderen Curr-> nächsten NULL zu stoppen. Aber du zeigst weiter auf das letzte Element zum Schwanz. Und das bedeutet sehr wahrscheinlich, dass Sie entweder 1 Element über Ihre Gruppe hinaus kopieren oder noch schlimmer (da Sie die Endstelle nicht korrekt initialisieren können), versuchen Sie zufällige Orte zu kopieren, die früher oder später zum Programmabsturz führen.
+0

Kopie Konstruktor funktioniert –

+2

Nein, wie hier gezeigt, tut es nicht. Sie haben wahrscheinlich (un) Glück, wenn es so ist. Sie haben nicht an Ihre Klasseninvarianten gedacht und initialisieren sie nicht konsequent in verschiedenen Konstruktoren. – Tomek

+0

Es funktioniert aber in Ordnung –

Verwandte Themen