2016-06-29 5 views
-3
class Iterator; 

class SortedList { 

    friend class Iterator; 

private: 
    Node* root; 

    Node* minim(Node* node) const { 
     while (node->getLeft() != nullptr) 
      node = node->getLeft(); 
     return node; 
}; 

public: 
    SortedList() { 
     root = nullptr; 
    }; 

    Iterator iterator() { 
     Node* min = minim(root); 
     return Iterator(*this, min); // Here says that Iterator has no constructors 
    }; 
}; 


class Iterator { 
private: 
    const SortedList& list; 
    Node* current; 

public: 
    Iterator(const SortedList& list, Node* current) : list{ list }, current{ current } {}; 

}; 

Es sagt int die Iteratormethode von SortedList, dass die Iterator Klasse nicht Bauer sagt auch nicht über oder nicht passend, und wenn ich einige Parameter ändern um falsch zu sein, gibt es an, dass es keine mit diesen Parametern gibt.Klasse hat keinen Konstruktor, aber es hat und mit richtigen Parametern

Eine andere Sache, wenn ich die Iterator-Methode auskommentieren und einen Iterator in main durch Schreiben Iterator es {meine Parameter} instanziieren funktioniert es gut.

+1

Setzen Sie ** nicht ';' 'nach dem letzten'} 'Ihrer Funktionen! – abelenky

+4

Bevor Sie 'Iterator' definieren, ist es ein unvollständiger Typ, und Sie können nicht viel mit einem unvollständigen Typ machen. – AndyG

+1

Es klingt mehr wie Sie möchten, dass Iterator von einer nach vorne deklarierten 'SortedList' abhängt und' SortedList' von einem kompletten 'Iterator' abhängt. – AndyG

Antwort

1

Iterator ist ein unvollständiger Typ, wenn Sie verwenden:

Iterator iterator() { 
    Node* min = minim(root); 
    return Iterator(*this, min); // Here says that Iterator has no constructors 
}; 

Verschieben Sie die Definition der Funktion nach Definition von Iterator.

class Iterator; 

class SortedList { 

    friend class Iterator; 

private: 
    Node* root; 

    Node* minim(Node* node) const { 
     while (node->getLeft() != nullptr) 
      node = node->getLeft(); 
     return node; 
}; 

public: 
    SortedList() { 
     root = nullptr; 
    }; 

    // Just the declaration 
    Iterator iterator(); 
}; 


class Iterator { 
private: 
    const SortedList& list; 
    Node* current; 

public: 
    Iterator(const SortedList& list, Node* current) : list{ list }, current{ current } {}; 

}; 

// Now the definition  
Iterator SortedList::iterator() { 
    Node* min = minim(root); 
    return Iterator(*this, min); 
}; 
+0

Vielen Dank, es funktioniert jetzt. Eine interessante Anmerkung: Ich habe etwas ähnliches, aber Vorlagen und es funktioniert ohne diesen "Trick" gibt es einen Unterschied, den ich wissen sollte? – Lorand

+0

@Lorand: Vorlagen sind "Kompilieren wenn verwendet". An der Stelle, an der die Vorlage verwendet wird, sind wahrscheinlich beide Definitionen bereits verfügbar. – Pixelchemist

Verwandte Themen