C++ warum output stream mit der Funktion übergeben?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Aus diesem Grunde hat sich für Ein- und Ausgaben doch die Überladung der Shiftoperatoren eingebürgert:

#include <iostream> // cout, endl
#include <fstream> // ofstream

#include <ostream>

namespace gfx {

struct Point {
  int x;
  int y;
};

::std::ostream & operator << (::std::ostream & os, const Point & p) {
  return os << "Point { " << p.x << ", " << p.y << " }";
}

} // namespace

int main(void) {
	using namespace ::std;

	gfx::Point offset { 123, 456 };

	offset.x += 1111;
	offset.y += 5222;

	cout << offset << endl;

	ofstream ofs { "point.log" };
	ofs << offset << endl;
}

Das Programm gibt dir folgenden Text aus:

Point { 1234, 5678 }

Die selbe Ausgabe findet sich in der Datei "point.log". Der Grund, warum du also niemals direkt in ::std::cout schreiben solltest ist, weil du dich damit der Flexibilität beraubst, deine Ausgabe jederzeit beliebig umleiten zu können!

Der Vorteil dabei ist, dass du jede Form von Ausgabestrom nutzen kannst. Spezielle Ausgabefunktionen sollte man i. d. R. niemals schreiben, es sei denn, es gibt einen wirklich guten (!) Grund dafür. (z. B. eine Ausgabe in einem speziellen JSON- oder XML-Format, oder binäre Ausgabe)

Außerdem sollte die Ausgabe bei überladenem Shift-Operator so knapp wie möglich sein, und nicht mit einem Zeilentrenner abschließen, sodass der Aufrufer jederzeit selbst entscheiden kann, wie er die textuelle Repräsentation deiner speziellen Typen in seine eigene Ausgabe einbauen möchte.

Apropos "Repräsentation": Bei Python wird ordentlich zwischen str() und repr() unterschieden. So etwas muss man in C++ per Hand nachbauen, ist aber sehr angenehm, wenn man die Formatierung für interne Logs und Endbenutzer aufteilen möchte. Trotzdem empfiehlt sich natürlich immer ein "vernünftiger" Logging-Framework bei "richtigen" Projekten ... aber naja ...

Viel Spaß noch beim Programmieren! :)

Vermutlich ist euer Dozent/Lehrer der Ansicht, dass ihr vielleicht mal in einen anderen Stream ausgeben müsst (Datei, Netzwerk, benannte Pipe, ...). Dann braucht man an den Funktionen selbst nichts zu ändern.

Wie sinnvoll das ist, darüber kann man sich streiten. Zumindest ist es nicht völlig sinnlos.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Ich sehe keinen Grund dafür es zu übergeben - Es ergibt in meinen Augen auch schlichtweg keinen Sinn.