2016-06-12 19 views
-2

Ich schreibe eine einfache Linkliste, die gut funktioniert, aber ich bin auf der Überlastung der Ostream (ich bin mir nicht sicher, ob ich Ostream oder Instream! :Wie man den Iostream Operator überlastet, um eine Funktion für den gesamten Stream auszuführen

class List 
{ 
public: 
    void addToEnd(int data); 
    /* operator overloads */ 
    friend std::istream& operator >> (std::istream& is, int data); 
}; 

std::istream& operator>>(std::istream& is, int data) 
{ 
    for(int i = 0; i < is.gcount(); i++) 
    { 
     // how to call ist::addToEnd(data); 
    } 
} 

würde ich es gerne machen irgendwie in der Lage sein:

List list(); 
list << 2 << 3 << 4; 

so, dass ich dieses Formular benutzen, statt addToEnd(X)

+0

BTW, die Anweisung 'List list();' deklariert eine Funktion namens 'list', die keine Argumente annimmt und ein Objekt vom Typ' List' zurückgibt. Du wolltest wohl 'Listenliste schreiben', 'Listenliste {};' oder 'Listenliste = Liste();' –

+0

@ DietmarKühl ja danke es war nur ein Tippfehler: P –

Antwort

2

Das Beispiel Sie zeigen Aufruf ist:

list << 2 << 3 << 4; 

Offensichtlich müssen Sie operator << zu überlasten, nicht operator >>. Die Argumente für die << sind List und int, so dass die Funktion, die Sie brauchen, ist:

List& operator <<(List& list, int data) 
{ 
    list.addToEnd(data); 
    return list; 
} 

Beachten Sie, dass diese Funktion muss nicht ein Freund sein, weil es nur öffentliche Methoden von List verwendet.

Es ist kein istream oder ostream beteiligt.

+0

Danke. aber ich kann es nicht kompilieren. Ich habe 'List & Operator << (List & list, int data);' in den Header eingefügt, aber ich bekomme eine Beschwerde: zu viele Parameter für diese Operator-Funktion –

+0

* Wo * hast du sie hinzugefügt? Es ist eine eigenständige Funktion, daher sollte sie außerhalb der Klasse deklariert werden. (Ich würde auch geneigt sein, es inline zu deklarieren, weil es so kurz ist, und der Compiler kann dann sehen, dass es nur eine Reihe von Aufrufen von 'addToEnd' ist. –

+0

Danke nochmal, zuerst habe ich die Deklaration in die Header-Datei für' List hinzugefügt "Klasse. Aber dann habe ich nur den Quellcode allein hinzugefügt und es hat funktioniert. So hat diese Überladung nichts mit dem Header oder der Klasse selbst zu tun? –