Operator << überladen



  • std::ostream& operator<<(std::ostream& out, const Kugel& rhs){
       out << rhs.r << " " << rhs.x;
       return out;
    }
    

    ostream kann auch eine Datei sein oder ?



  • Sorry, sollte nach C++ . Sorry!



  • ostream ist generisch (ueber vererbung, nicht ueber templates) und kann osstream/sstream fuer string, cout fuer die standardausgabe, ofstream/fstream oder selbst definierten streams sein.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Marthog schrieb:

    ostream ist generisch (ueber vererbung, nicht ueber templates) und kann osstream/sstream fuer string, cout fuer die standardausgabe, ofstream/fstream oder selbst definierten streams sein.

    An sich ist ostream schon eine konkrete Klasse. Aber stringstream und fstream und ofstream* erben von ostream (und noch ein paar mehr. Oder ggf. auch nutzerdefinierte Streams). Und cout ist eine Instanz von ostream. Entsprechend kann man die Funktion mit cout als Argument aufrufen, aber natürlich auch mit jeder Instanz einer abgeleiteten Klasse.

    PS: Die Vererbungshierarchie der ostreams habe ich hier etwas vereinfacht dargestellt. In Wahrheit sind das alles Instanzierungen von Klassentemplates, die dann voneinander erben.

    *: Welches übrigens nicht von fstream erbt!



  • Hallo Leute, folgende Frage bei z.B.:

    MyClass.hpp

    class MyClass{
    
    	public: 
    	        int x_;
    
    	private: 
                int y_;
    
    };
    
    std::ostream& operator<<(std::ostream& out, const MyClass& rhs){
       out << rhs.x << " " << rhs.y;
       return out;
    }
    

    Kann ich so den Public und den Private Member schreiben ? Bzw, brauche ich auf den Zugriff für die Private Members noch etwas anderes ?

    Und gehört die "Überladung" in die hpp oder die cpp Datei ? Ich hätte Sie "gefühlsmäßig" eigentlich in die cpp gepackt, muss ich sie aber trotzdem inder hpp deklarieren ?


  • Mod

    cpp_beginner schrieb:

    Kann ich so den Public und den Private Member schreiben ? Bzw, brauche ich auf den Zugriff für die Private Members noch etwas anderes ?

    Warum probierst du es nicht einfach aus? Es gelten die gleichen Regeln, wie überall anders auch. Das ist eine ganz normale Funktion, bloß mit einem ungewöhnlichen Namen. Also: Nein. Die Funktion muss entweder ein friend der Klasse sein oder die Klasse muss irgendeine Art von Schnittstelle zur Verfügung stellen, über die die Funktion die privaten Member ausgeben kann.

    Und gehört die "Überladung" in die hpp oder die cpp Datei ?

    Es gelten die gleichen Regeln, wie überall anders auch. Das ist eine ganz normale Funktion, bloß mit einem ungewöhnlichen Namen. Daher gelten auch die gleichen Leitlinien, wo man seine Funktionen warum definieren sollte.

    Ich hätte Sie "gefühlsmäßig" eigentlich in die cpp gepackt, muss ich sie aber trotzdem inder hpp deklarieren ?

    Es gelten die gleichen Regeln, wie überall anders auch. Das ist eine ganz normale Funktion, bloß mit einem ungewöhnlichen Namen. Daher gelten auch die gleichen Leitlinien, wo man seine Funktionen warum deklarieren sollte.



  • Warum probierst du es nicht einfach aus?
    

    Handynutzung / OS ohne IDE 🙂

    Es gelten die gleichen Regeln, wie überall anders auch. Das ist eine ganz normale Funktion, bloß mit einem ungewöhnlichen Namen. Also: Nein. Die Funktion muss entweder ein friend der Klasse sein oder die Klasse muss irgendeine Art von Schnittstelle zur Verfügung stellen, über die die Funktion die privaten Member ausgeben kann.

    Ok, das mit friend leuchtet mir ein. Wie ist das andere gemeint ?


  • Mod

    beg_offl schrieb:

    Ok, das mit friend leuchtet mir ein. Wie ist das andere gemeint ?

    So etwas geht auch:

    class MyClass
    {
    private:
      int y_;
    public:
      int x_;
      std::ostream& public_printer(std::ostream& out) const
      {
        return out << x_ << " " << y_;  
      }
    };
    
    std::ostream& operator<<(std::ostream& out, const MyClass& rhs)
    {
      return rhs.public_printer(out);
    }
    


  • Aaah.. Ok, das leuchtet ein. Werd das morgen mal ausprobieren. Das gefällt mir fast noch besser.

    Eine Frage nur, das hab ich davor noch nicht gesehen :

    std::ostream& public_printer(std::ostream& out) const
                                                     ^
    

    Was meint das const und wo kann ich was zu dieser "Signatur" nachlesen.. also nach was muss ich da suchen ?


  • Mod

    cpp_beg_offl schrieb:

    Eine Frage nur, das hab ich davor noch nicht gesehen :

    std::ostream& public_printer(std::ostream& out) const
                                                     ^
    

    Was meint das const und wo kann ich was zu dieser "Signatur" nachlesen.. also nach was muss ich da suchen ?

    Das bedeutet, dass diese Methode kein (non-mutable) Member der Klasse ändern kann und auch keine nicht-const Methoden aufrufen kann. Oder kurz: Diese Methode lässt ein Objekt unverändert. Somit kann man sie auch für Objekte aufrufen, die konstant sind. So wie in diesem Fall das rhs.

    Nachzulesen? Das ist Grundlagenstoff, der sollte in jedem guten Buch stehen. Aber mehr als das ,was ich oben geschrieben habe, gibt es dazu nicht zu sagen. Vielleicht ganz allgemein das Stichwort "const correctness", wo const Methoden eben ein Teil sind, um die const correctness sicher zu stellen.


  • Mod

    Aber mehr als das ,was ich oben geschrieben habe, gibt es dazu nicht zu sagen.

    Auch nichts über spezielle Memberfunktionen? Oder thread safety? Den Typ von this ?


  • Mod

    Arcoth schrieb:

    Aber mehr als das ,was ich oben geschrieben habe, gibt es dazu nicht zu sagen.

    Auch nichts über spezielle Memberfunktionen? Oder thread safety? Den Typ von this ?

    Wenn du meinst, dass dies dem Threadersteller (oder anderen Lesern) etwas bringt, dann nur zu: Tob dich aus!



  • Auch nichts über spezielle Memberfunktionen? Oder thread safety? Den Typ von this?

    Nö, das von SeppJ reicht vollkommen. 👍


Log in to reply