C++ warum output stream mit der Funktion übergeben?
Ich wurde heute gefragt, warum ich meinen output stream immer der Funktion übergebe, anstatt es mit std::cout einfach ausgeben zu lassen.
An sich eine interessante Frage. Auf Anhieb wusste ich keine Antwort. Ich habe es nun mal so gelernt. Vielleicht hat es was damit zu tun, dass man dann nur einen stream hat der alles sammelt, aber sicher bin ich mir nicht.
Wisst ihr vielleicht warum man das macht oder ob es überhaupt sinnvoll ist?
3 Antworten
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.
Ich sehe keinen Grund dafür es zu übergeben - Es ergibt in meinen Augen auch schlichtweg keinen Sinn.