You are here

Überladen von Ein-/Ausgabe-Operatoren

Operatoren müssen keine Member-Funktionen sein, sondern werden als globale Funktionen eingeführt, wobei ein Ausgabe-Operator als Argument eine Referenz auf einen ostream (bzw. basic_ostream) und eine Referenz auf die auszugebende Variable enthält und eine Referenz auf sich selbst zurückgibt. Eingabe-Operatoren werden analog dazu erstellt.
Beispiel:
  std::ostream& operator << (std::ostream&, CString&);
  std::istream& operator >> (std::istream&, std::stream&);
Für die Standard-Datentypen sind ostream bzw. istream bereits überladen. Wenn man eigene Operatoren definiert, versucht man zuerst, den ein-/auszugebenden Datentyp auf die Standard-Datentypen zurückzuführen.
Beispiel:
  std::ostream& operator << (std::ostream& ostr, CString& cstr)
  {
  &nbsp: return(ostr << (LPTCSTR) cstr);
  }

Im Zweifelsfall kann man den Datentyp immer auf den Typ char zurückführen. Man kann sich auch der Funktionen istream::get(), istream::getline() und ostream::put() bedienen.
Bei der Deklaration von Operatoren für eigene Klassen muss man die Zugriffskontrolle beachten. Für die Ein-/Ausgabe von nicht-public Daten muss der Operator in der Klassen-Deklaration als friend eingeführt werden.
Mit den Operatoren
  std::ostream& operator << (std::ostream&, CString&);
  std::ostream& operator << (std::ostream&, std::string&);

  std::ostream& operator << (std::ostream& ostr, CString& cstr)
  {
  &nbsp: return(ostr << (LPTCSTR) cstr);
  }

  std::ostream& operator << (std::ostream& ostr, std::string& sstr)
  {
  &nbsp: return(ostr << sstr.c_str());
  }
ergibt sich das obige Beispiel zu:

  OG_constream text_fenster;

  int i = 10;
  double d = 3.14156;
  std::string sstr("STL String");
  CString cstr("Microsoft CString");

  text_fenster << "i = " << i << std::endl;
  text_fenster << "d = " << d << std::endl;
  text_fenster << "STL String = " << sstr << std::endl;
  text_fenster << "Microsoft CString = " << cstr << std::endl;