2016-10-30 5 views
-4

Ich habe ein Problem mit der Ausrichtung von Operator [] und Operator =. Ich kann nicht verstehen, Funktion LinkedList LinkedList :: Operator = (const int & n) genau zu schreiben. es sieht nicht aus wie ein Operator = das ich durchgemacht habe. Bitte helfen Sie mir, die Natur davon zu verstehen (zusammen mit dem Code wie möglich). Vielen Dank!Wie operator [] mit operator =?

Datei .h

class LinkedList 
    { 
    private: 
     Node* pHead; 
     Node* pTail; 
     int curN; 
    public: 
     int& operator[](const int& i); 
     LinkedList operator = (const int& n);// 
    }; 

Datei CPP

int& LinkedList::operator[](const int& i) 
    { 
     int tmp; 
     if (i < 0) 
      tmp = 0; 
     else if (i > this->curN) 
      tmp = this->curN - 1; 
     else 
      tmp = i; 

     int count = 0; 
     Node* pNode = this->pHead; 
     while (count < tmp) 
     { 
      count++; 
      pNode = pNode->pNext; 
     } 
     return pNode->_data; 
    } 

    LinkedList LinkedList::operator=(const int& n) 
    { 
     //Problem here 
    } 

Und Datei main.cpp

int main() 
    { 
     srand(1234); 
     LinkedList l; 
     l[-1] = 9000; 
     l[4] = 2000; 
     l[100] = 10000; 
     cout << l << endl; 
    } 
+2

Nebenbei, overloading 'operator []' auf einer verknüpften Liste ist keine gute Design-Idee. Die meisten Leute denken, dass 'operator []' einen konstanten Zeitzugriff auf etwas bietet, und im Fall der verknüpften Liste bietet es einen linearen Zeitzugriff. – Sean

+0

Operator '=' ist völlig unabhängig. Ihr Code verwendet es nicht und würde so funktionieren, wie es ist. – dasblinkenlight

+0

Sollte es funktionieren? Wird 'operator []' ** ** immer einen gültigen Link finden und seine Daten zurückgeben? – StoryTeller

Antwort

0
l[-1] = 9000; 
    l[4] = 2000; 
    l[100] = 10000; 

Auf dieser Linie von Codes, LinkedList::operator=(const int& n) wird nicht genannt werden, weil LinkedList::operator[](const int& i) einen Verweis zurück auf int.

was Sie tun möchten, ist ein Knoten auf Ihrem LinkedList::operator[](const int& i), und definieren Sie Ihre eigenen operator= dort.

Node& LinkedList::operator[](const int& i) 
    { 
     int tmp; 
     if (i < 0) 
      tmp = 0; 
     else if (i > this->curN) 
      tmp = this->curN - 1; 
     else 
      tmp = i; 

     int count = 0; 
     Node* pNode = this->pHead; 
     while (count < tmp) 
     { 
      count++; 
      pNode = pNode->pNext; 
     } 
     return *pNode; 
    } 

///Your node class 
    class Node 
    { 
     public: 
      int _data; 
      Node& operator=(const int data) 
      { 
       _data = data; 
       return *this; 
      } 
    } 

Edit:
Stellen Sie sicher, pNode irgendwo zu platzieren, wo es kann später gelöscht werden Speicherverlust zu vermeiden.

+0

Ich glaube nicht, dass er das machen will. Wie kann er den Wert des Knotens abrufen? Ich denke, der Zweck der Node-Klasse ist in der LinkedList-Klasse gekapselt – Hugal31

+0

@ Hugal31 eingekapselten Daten bedeutet nicht, dass es nicht gelesen und geschrieben werden kann –

+0

Ja, aber ich denke, die Lösung von Mr.Duy ist ziemlich gut. Er versteht einfach nicht den Zweck des Zuteilungsoperators. – Hugal31

0

Die operator= ist für Ihr Objekt, nicht für seinen Inhalt.

In diesem Fall wird LinkedList::operator=(const int& n) genannt:

In Ihrem Fall
LinkedList l; 
l = 5; 

nur die LinkedList::operator[] genannt wird.

l[4] = 2000; 
+0

Jetzt verstehe ich das Problem, danke! –

0

Ihr Zuweisungsoperator muss in der Knotenklasse und nicht in der Listenklasse enthalten sein.

Sie ordnen einem Knoten zu. Um den Listen-Klassenzuweisungsoperator aufzurufen, müssten Sie folgendes tun:

l = LinkedList();

(Aber das ist nicht das, was Sie wollen)

+1

Jetzt verstehe ich das Problem, danke! –