2017-04-16 1 views
1

Die DummyNode Deklarationsvariable funktionierte gut, bis ich Iterator-Klasse als verschachtelt geschrieben habe, jetzt gibt es mir einen Fehler ungültige Verwendung von nicht-statischen Daten Mitglied ' LinkedList :: dummyNode‘C++, wenn i Iterator-Klasse entfernt, es funktioniert gut Vorlageungültige Verwendung von nicht-statischen Datenelement 'linkedList <int> :: dummyNode' C++

class linkedList 
{ 

private: 
    listNode<T> * head, *tail; 
    listNode<T> * dummyNode = new listNode<T>; 
    int sz = 0; 
public: 
    class iterator 
    { 
    public: 
     iterator() 
     { 
      itrNode = head; 
     } 
     void operator ++() 
     { 
      try{ 
       if(itrNode == dummyNode) 
        throw "Sorry this is the end of the list\n"; 
       else 
       { 
        itrNode = itrNode->next; 
       } 

      }catch(const char * error) 
      { 
       cerr << error; 
      } 
     } 
     T& operator *() 
     { 
      return *(itrNode->value); 
     } 
     void operator --(); 
    private: 
     listNode<T> * itrNode; 

    }; 
    linkedList(); 
    ~linkedList(); 
    linkedList(T value, int initial_size); 
    iterator begin(); 


}; 
+0

Ihr Konstruktor in der inneren Klasse verweist auf "head", was ein Datenelement der äußeren Klasse ist. Sie sollten stattdessen eine Funktion "linkedlist :: begin" erstellen, die den richtigen Iterator zurückgibt. Wenn Sie direkte Konstruktoren für den Iterator benötigen, benötigt er eine "Linkedlist" als Argument. – jwimberley

+0

Entschuldigung ich kann nicht verstehen, wo ist das Problem damit? und ich habe die Lösung auch nicht verstanden, würdest du bitte den Code schreiben ?! –

Antwort

0

A C++ verschachtelte Klasse keine Daten mit seiner äußeren Klasse teilen - wenn es der Fall wäre, jede Instanz der inneren Klasse wäre in einer Eins-zu-Eins-Beziehung mit einer entsprechenden Instanz einer äußeren Klasse und würde somit keine zusätzliche Funktionalität hinzufügen. Stattdessen sind die Hauptziele von verschachtelten Klassen:

  1. Namespace Bedeutung: linkedlist::iterator aussagekräftiger ist als linkedlist_iterator
  2. auf der Version Standard C++ Je eine verschachtelte Klasse hat zusätzliche Sichtbarkeit der Mitgliedsobjekte von Instanzen der Außen Klasse
  3. Vielleicht andere, die ich von

das größte Problem in Ihrem Code nicht bewusst bin, ist der Konstruktor des Iterators

iterator() 
    { 
     itrNode = head; 
    } 

Die Daten head nichts im Zusammenhang mit der inneren Klasse bedeutet, weil sein ein Datenelement eines linkedlist Objekt - wieder, die iteratornicht zu einer Instanz der linkedlist Klasse gehört. Stattdessen sollte der Konstruktor so etwas wie

iterator(linkedlist<T>& list) 
    { 
     itrNode = list.head; // Might not work in C++03 
    } 

sein Es könnten auch andere Änderungen, die Sie in Bezug auf die templatization machen müssen (ich bin nicht sicher, ich habe keine verschachtelten Templat Klassen vor gemacht). Dieser Konstruktortyp für die verknüpfte Liste sollte ebenfalls funktionieren, entspricht jedoch nicht den Standardparadigmen. Weitere Standard würde Funktionen das Hinzufügen

iterator linkedlist::begin(); 
iterator linkedlist::end(); 

zum linkedlist Klasse. Noch besser wäre es, begin(linkedlist&) und end(linkedlist&) Funktionen zu erstellen. Dies wird in this following SO post erklärt.

+0

was ist mit if (itrNode == dummyNode) ich denke, ich sollte das gleiche tun, aber ich weiß nicht wie ?! –

+0

Sie haben Recht, dass Sie das auch reparieren müssen. Und du weißt wie; Sie haben bereits einen privaten itrNode-Eintrag in der 'iterator'-Klasse und Sie müssen das gleiche für den dummyNode tun. Ich gebe zu, ich bin mir nicht sicher, was Ihr Dummy-Knoten tut, aber ich denke, diese Details sind in der Implementierung von 'Linkedlist''s Konstruktoren und Member-Funktion. – jwimberley

Verwandte Themen