Methoden operator<< und operator>>



  • Hallo,
    ich habe folgendes Programm zu schreiben:
    Erstellen Sie eine Klasse Liste, in der beliebig viele Integerwerte gespeichert werden können. Implementieren Sie die Methoden operator<< und operator>> so, dass Listen formartiert ausgegeben und eingelesen werden können. (Gewünschtes Format für die Darstellung einer Liste mit den drei Werten 1, 2 und 3 als Inhalt ist [1,2,3].)

    Bis jetzt habe ich folgendes gemacht:
    #include <iostream>
    using namespace std;

    class Liste {
    public:
    int x; //Anzahl der eingegebenen Zahlen
    int *y;
    Liste () {x=0;}
    ~Liste() {if 👍 delete [] y;} //Destruktor

    void werte(int zahl) {
    if(zahl == 0)
    return;
    if(x == 0) {
    y = new int[x+1];


    x++; }
    else{
    int *iarr = new int[x+1];
    for (int i = 0; i < x; i++){
    iarr[i] = y[i];}

    x++;
    y = iarr;
    }
    }
    };

    ostream& operator>>(ostream& out, const Liste& o){
    out << '[';
    for (int i=0; i<o.x; i++) {
    out << o.y[i];
    if (i != (o.x-1))
    out << ',';
    else
    out << ']';
    }
    return out;
    }

    istream& operator>>(istream& in, const Liste& in) {
    in >> '[';
    for (int i=0; i<in.x; i++) {
    in >> in.y[i];
    if (i != (in.x-1))
    in >> ',';
    else
    in >> ']';
    }
    return in;
    }

    int main () {
    Liste z;
    int zahl;
    cout << "Bitte geben Sie beliebig viele Zahlen ein (mit 0 beenden Sie die Eingabe): " << endl;
    do {
    cin >> zahl;
    z.werte(zahl);
    } while(zahl != 0);
    cout<< "Die Liste beinhaltet die Werte: " << z;
    }

    Die Methode ostream& operator>> hat schon mal funktioniert, allerdings habe ich keine Idee wie ich istream& operator<< einbauen kann bzw. wie die Liste direkt mit der vorgegebenen Formatierung eingegeben werden kann.

    Meine Fehlerliste sieht folgenderweise aus:
    ../9.2.cpp:41: error: conflicting declaration ‘std::istream& in’
    ../9.2.cpp:41: error: ‘in’ has a previous declaration as ‘const Liste& in’
    ../9.2.cpp:42: error: no match for ‘operator>>’ in ‘in >> '['’
    ../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
    ../9.2.cpp:44: error: no match for ‘operator>>’ in ‘in >> ((int*)in->Liste::y)[i]’
    ../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
    ../9.2.cpp:46: error: no match for ‘operator>>’ in ‘in >> ','’
    ../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
    ../9.2.cpp:48: error: no match for ‘operator>>’ in ‘in >> ']'’
    ../9.2.cpp:41: note: candidates are: std::istream& operator>>(std::istream&, const Liste&)
    ../9.2.cpp:50: error: invalid initialization of reference of type ‘std::istream&’ from expression of type ‘const Liste’
    make: *** [9.2.o] Error 1

    Bin um jede Hilfe dankbar 🙂



  • Die Fehlermeldung bezieht sich auf diese Zeile:

    istream& operator>>(istream& in, const Liste& in) {
    

    ../9.2.cpp:41: error: conflicting declaration ‘std::istream& in’
    ../9.2.cpp:41: error: ‘in’ has a previous declaration as ‘const Liste& in’

    Fällt dir was auf?



  • ich depp. habe den Teil geändert:

    istream& operator>>(istream& in, const Liste& inp) {
    in >> '[';
    for (int i=0; i<inp.x; i++) {
    in >> inp.y[i];
    if (i != (inp.x-1))
    in >> ',';
    else
    in >> ']';
    }
    return in;
    }

    allerdings bekomme ich immer noch fehlermeldungen:

    ../9.2.cpp:42: error: ambiguous overload for ‘operator>>’ in ‘in >> '['’
    ../9.2.cpp:46: error: ambiguous overload for ‘operator>>’ in ‘in >> ','’
    ../9.2.cpp:48: error: ambiguous overload for ‘operator>>’ in ‘in >> ']'’
    /us



  • Hi,
    kannst du mir das erklären?

    in >> ']';
    


  • Die Aufgabenstellung sagt ja, dass die Liste mit einer bestimmten Formatierung ein- und ausgegeben werden soll. Also die Eingabe soll wie die Ausgabe aussehen.
    (Gewünschtes Format für die Darstellung einer Liste mit den drei Werten 1, 2 und 3 als Inhalt ist [1,2,3].)



  • Ja, es wäre schön, wenn das so in der Art gehen würde. Aber leider kann man so nicht Zeichen überspringen. Erstelle dir eine temporärere char Variable, lies darin ein und prüfe, ob sie '[' ist.



  • Könntest du mir das vllt ein bisschen genauer erklären. Stehe gerade ein bisschen auf dem Schlauch. Habe eben nochmal probiert es so zu machen: (funktioniert aber auch nicht)

    istream& operator>>(istream& in, const Liste& inp) {
    int k=x-1; //Anzahl Komma
    char q[x+k+2]; //hat Größe: Anzahl Zahlen, Anzahl Komma, zwei Klammern
    int i=0;
    q[i]='[';
    for (int i=1; i<inp.x; i++) {
    q[i]=inp.zahl[y];
    i++;
    if (i != (inp.x-1))
    q[i]= ',';
    i++;
    else
    q[i]= ']';
    }
    return in;
    }

    wie kann ich denn meine Zahlen einlesen? 😕



  • Er meint nur ein einzelnes Zeichen einlesen:

    char c;
    in >> c;
    if (c != '[')
     // error
    

    Was du im Fehlerfall machst, ist dir überlassen.

    Typischerweise schreibt man da

    in.setstate(std::ios_base::failbit);
    return in;
    


  • habe den Teil jetzt so geändert:

    istream& operator>>(istream& in, const Liste& inp) {
    char c;
    in >> c;
    if (c != '[')
    in.setstate(std::ios_base::failbit);
    else
    do {
    in >> c;
    } while (c >= 0 || c ==',');
    if (c == ']')
    return in;
    }

    allerdings funktioniert die ausgabe jetzt nicht mehr.



  • class Liste {
    public:
    	int x;  // tolle
    	int *y; // namen
    	Liste() { x = 0; }
    	~Liste() { if (y) delete[] y; } // if unnoetig, delete[] 0 hat keine Wirkung.
    
    	void werte(int zahl) {
    		if (zahl == 0) // den Spezialfall wirklich hier behandeln?
    			return;
    		if (x == 0) {
    			y = new int[x + 1]; // wenn du 1 meinst, dann schreib 1 hin. "new int" taets auch.
    			y[x] = zahl; // *y = zahl
    			x++;
    		}
    		else{
    			int *iarr = new int[x + 1];
    			for (int i = 0; i < x; i++){
    				iarr[i] = y[i];
    			}
    			iarr[x] = zahl;
    			x++;
    			y = iarr; // der pointer auf den alten Speicherbereich ist jetzt futsch. wer gibt den Speicher frei?
    		}
    	}
    };
    


  • xhkjd



  • Verwende bitte [code]-Tags, wenn du code postest.
    Du verwendest den istream& operator>>(istream& in, const Liste& inp) nirgends. In der main() ließt du immer noch in einen int ein, nicht in eine Liste . Wenn du wie bisher 1[enter]2[enter]...0[enter] eingibst läuft dein Programm wie vorher.
    Am operator>>() stimmt noch was nicht. Du ließt immer in einen char nie einen int und du veränderst die Liste darin garnicht.



  • xcvnb


Anmelden zum Antworten