Methoden operator<< und operator>>



  • 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