ostream Problem: Überladen von <<



  • Guten Morgen,
    ich sitze seit einigen Tagen an einer Aufgabe, die auch den ostream verwenden soll und habe mich auch soweit eingearbeitet, dass es zu 99% klappt. Nur habe ich noch einen Fehler den ich auf Teufel komm raus nicht behoben bekomme und googlen hilft mir auch nicht weiter, da ich nichts finde bzw nicht weiß wonach genau ich googlen soll.

    Ich poste erstmal den relevanten Code:
    Code der Klasse Addresse:

    ostream& address::print(ostream& os){
    	os << "\t" << name << endl;
    	os << "\t" << street << endl;
    	os << "\t" << city << endl;
    	os << "\t" << country << endl;
    	return os;
    }
    
    ostream& operator <<(ostream& os, address& a){
    	return a.print(os);
    
    }
    

    Code der Klasse mail:

    ostream& mail::print(ostream& os){
    	os << "Mail-ID: " << id << endl;
    	os << "Absender:\n";
    	os << from.print(os);
    	os << "Empfaenger:\n";
    	os << to.print(os);
    	if(!delivered){
    		os << "Post wurde noch nicht ausgeliefert!";
    	}
    	return os;
    }
    
    ostream& operator <<(ostream& os, mail& m){
    	return m.print(os);
    
    }
    

    Ich überlade also den << Operator, das klappt auch alles, es gibt nur ein Problem!
    Wenn ich

    cout << mailobjekt;
    

    schreibe habe ich Datenschrott an 2 Stellen stehen und zwar vor "Empfaenger" und vor "Post wurde noch nicht ausgelifert".
    Ich habe die Vermutung, dass wenn die print Funktion von address in der mail print aufgerufen wird mir etwas Datenschrott mit zurückgelifert wird. Ich verstehe aber nicht warum, da wenn ich zum Beispiel die Klasse address ausgebe per überladenen Operator alles klappt, nur beim überladen von mail habe ich an diesen 2 Stellen bei der Ausgabe Datenschrott stehen.

    http://s1.directupload.net/file/d/3123/caww3b45_jpg.htm

    Hier mal ein Bild um es zu zeigen.
    Lange Rede, kurzer Sinn, ich verzweifel so langsam bei dem Versuch den Datenschrott weg zu bekommen, ich hoffe es kann mir jemand helfen.

    Und dann habe ich noch ein zweites Problem, wo ich wahrscheinlich einfach nur ein Brett vorm Kopf habe, aber auch so langsam verzweifel.

    getTo Funktion der Klasse mail

    const address& mail::getTo(){
    	return to;
    }
    

    getName Funktion der Klasse address

    const string& address::getName(){
    	return name;
    }
    

    Und bei der folgenden Zeile bekomme ich dann einen Fehler

    cout << aMail.getTo().getName();
    

    http://s1.directupload.net/file/d/3123/945vc4a7_jpg.htm

    Auch den verstehe ich nicht, denn wenn ich folgendes mache klappt es einwandfrei

    mail aMail(1020304);
    	address test = aMail.getTo();
    	cout << test.getName();
    

    Im Normalfall würde ich es dann halt einfach so machen, die Aufgabe verlangt aber, dass ich es so wie im ersten Fall schreibe. Die Übergabeparameter und Rückgabewerte darf ich auch nicht verändern und ich weiß nicht was ich sonst machen kann um den Fehler zu bereinigen.

    Ich hoffe es kann mir jemand weiterhelfen, dafür wäre ich sehr dankbar.

    Mfg



  • ostream& mail::print(ostream& os){
    	os << "Mail-ID: " << id << endl;
    	os << "Absender:\n";
    	os << from;        // oder: from.print(os);
    	os << "Empfaenger:\n";
    	os << to;          // oder: to.print(os);
    	if(!delivered){
    		os << "Post wurde noch nicht ausgeliefert!";
    	}
    	return os;
    }
    

    to in der Klasse mail ist const ? Dann muss mail::getTo() auch const sein:

    const address& mail::getTo() const {
    	return to;
    }
    


  • Swordfish schrieb:

    ostream& mail::print(ostream& os){
    	os << "Mail-ID: " << id << endl;
    	os << "Absender:\n";
    	os << from;        // oder: from.print(os);
    	os << "Empfaenger:\n";
    	os << to;          // oder: to.print(os);
    	if(!delivered){
    		os << "Post wurde noch nicht ausgeliefert!";
    	}
    	return os;
    }
    

    Das klappt! Vielen Dank, bzw das oder klappt nicht, weil so habe ich es gemacht und dann habe ich den Datenschrott wie im Bild, aber wenn ich es ohne das print(os) mache funktioniert es wunderbar. Ärgert mich ein wenig, dass ich nicht selber darauf gekommen bin es zu probieren.
    Also ich verstehe warum es so funktioniert, auf der anderen Seite verstehe ich aber nach wie vor nicht warum es mit dem aufrufen von print nicht funktioniert *rätsel*

    edit:
    ... Ok, nun auch verstanden, ich musste einfach das os << weglassen, weil es quasi doppelt gemoppelt war, da ich von print schon das objekt zurückbekomme. Die Frage hat sich also erledigt, mein Denkfehler hier 😉

    Swordfish schrieb:

    const address& mail::getTo() const {
    	return to;
    }
    

    Dies ist leider nicht die Lösung. Die Addressobjekte sind nicht constant angelegt in der mail klasse. Habe es aber mal ausprobiert mit dieser Funktion und auch to dementsprechend constant angelegt, aber es kommt exakt die selbe Fehlermeldung.
    Ich verstehe halt auch einfach nicht wieso

    mail aMail;
    address test = aMail.getTo();
    cout << test.getName();
    

    einwandfrei klappt, aber

    mail aMail;
    cout << aMail.getTo().getName();
    

    eine Fehlermeldung auswirft, obwohl es meinem Verständnis nach das selbe sein sollte.



  • Wahrscheinlich ist das die Fehlermeldung in dem Link?!
    Auch wenn es altbacken wird, ich würde Dich bitten, wenn Du schon Fragen stellst, wenigstens alle wichtigen Informationen in den Thread zu packen und mich nicht noch zu einem externen Dienstleister zu schicken.

    Anyway...
    Ich tippe ja (wie Swordfish) auch auf const correctness, also _beide_ getter const qualifizieren:

    const address& mail::getTo() const{
    	return to;
    }
    
    const string& address::getName() const{
    	return name;
    }
    


  • s/wird/wirkt/



  • Ja, es geht um die Fehlermeldung im Link.
    Es tut mir leid für die Unannehmlichkeiten mit dem externen Verweis. Ich saß recht lange an der Aufgabe und es war spät und die Verzweiflung groß und dann habe ich keine Option hier gefunden um ein Bild hochzuladen. Aber ich stimme zu, dass man es hätte besser lösen können, werde da nächstes mal besser drauf achten.

    Und scheinbar habe ich Swordfish missverstanden, da ich das const nur bei getTo gesetzt hatte, aber nicht bei getName.

    Es klappt alles wunderbar so.
    Problem ist nur, dass die getter-Methoden in der Aufgabe im UML-Klassendiagramm nicht als const gekennzeichnet sind, ich habe mich aber nun soweit informiert, dass man dies auch in bestimmten Fällen nicht machen muss und werde mich da noch etwas weiter einarbeiten.

    Vielen dank für die Hilfe aufjedenfall 👍


Anmelden zum Antworten