cout
-
Hallo,
cout ist ein Objekt vom typ ostream.
Es geht z.B.
cout.write("Hallo Forum", 10 );Da ich aber nicht expliziet cout anlegen muss, frag ich mich grade ob cout vielleicht statisch ist.
aber dann müßte der aufruf doch
cout::write("Hallo Forum",10 ) ;lauten
-
cout ist eine globale Variable.
-
In iostream (oder in einem anderen, in iostream inkludiertem Header):
extern ostream cout;
-
Dieser Thread wurde von Moderator/in Marc++us aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
wie kann ich mir selbst eine ostream Variable anlegen ? Hab Probleme mit dem Konstruktor .
ostream mycout ( )
-
Wo soll Dein ostream denn hinschreiben?
-
noch gar nix. Ich würd ihn erst mal gerne anlegen. Aber es gibt ja keinen Standardkonstruktor und mit den Parametern komm ich nicht zurecht.
-
blurry333 schrieb:
noch gar nix. Ich würd ihn erst mal gerne anlegen. Aber es gibt ja keinen Standardkonstruktor und mit den Parametern komm ich nicht zurecht.
Also soll er eigentlich ein Zeiger auf einen echten ostream sein?
-
blurry333 schrieb:
noch gar nix. Ich würd ihn erst mal gerne anlegen. Aber es gibt ja keinen Standardkonstruktor und mit den Parametern komm ich nicht zurecht.
Was soll ein ostream sein, der nirgendwohin schreibt (oder technisch gesprochen: Der nicht mit einem streambuf assoziiert ist.)? Solch ein Objekt macht keinen Sinn, daher kann man es auch nicht erstellen. Das wäre wie ein Sieb ohne Löcher, so etwas kann es einfach rein logisch nicht geben.
-
SeppJ schrieb:
blurry333 schrieb:
noch gar nix. Ich würd ihn erst mal gerne anlegen. Aber es gibt ja keinen Standardkonstruktor und mit den Parametern komm ich nicht zurecht.
Was soll ein ostream sein, der nirgendwohin schreibt (oder technisch gesprochen: Der nicht mit einem streambuf assoziiert ist.)? Solch ein Objekt macht keinen Sinn, daher kann man es auch nicht erstellen.
Das ist völlig legal. Und es verhält sich auch völlig legal.
std::ostream mycout(0); mycout << "hello, blurry" << std::endl;so etwas kann es einfach rein logisch nicht geben
Die IOStreams verhalten sich halt manchmal entgegen der Logik. Damit muss man sich abfinden.
-
paxador schrieb:
Das ist völlig legal. Und es verhält sich auch völlig legal.
std::ostream mycout(0); mycout << "hello, blurry" << std::endl;so etwas kann es einfach rein logisch nicht geben
Die IOStreams verhalten sich halt manchmal entgegen der Logik. Damit muss man sich abfinden.
Das ist UB.
Nicht so überzeugend...
-
...
-
Furble Wurble schrieb:
paxador schrieb:
Das ist völlig legal. Und es verhält sich auch völlig legal.
std::ostream mycout(0); mycout << "hello, blurry" << std::endl;so etwas kann es einfach rein logisch nicht geben
Die IOStreams verhalten sich halt manchmal entgegen der Logik. Damit muss man sich abfinden.
Das ist UB.
Nicht so überzeugend...
Der Konstruktor ruft
init(sb)auf ([basic.ios.cons]/1), danach gilt:[basic.ios.cons]/3 schrieb:
rdstate(): goodbit if sb is not a null pointer, otherwise badbit.
Bei
operator<<wird dann ein Sentry erstellt ([ostream.formatted.reqmts]/1) und geprüft und weil das badbit gesetzt ist, passiert nichts.Was ist daran UB

-
paxador schrieb:
Furble Wurble schrieb:
paxador schrieb:
Das ist völlig legal. Und es verhält sich auch völlig legal.
std::ostream mycout(0); mycout << "hello, blurry" << std::endl;so etwas kann es einfach rein logisch nicht geben
Die IOStreams verhalten sich halt manchmal entgegen der Logik. Damit muss man sich abfinden.
Das ist UB.
Nicht so überzeugend...
Der Konstruktor ruft
init(sb)auf ([basic.ios.cons]/1), danach gilt:[basic.ios.cons]/3 schrieb:
rdstate(): goodbit if sb is not a null pointer, otherwise badbit.
Bei
operator<<wird dann ein Sentry erstellt ([ostream.formatted.reqmts]/1) und geprüft und weil das badbit gesetzt ist, passiert nichts.Was ist daran UB

Jupp. Hast recht. Bin reflexartig von 17.6.4.9/1 ausgegangen.
War falscher Alarm...
-
Globale Variablen haben ein paar Nachteile. Beispielsweise ist es blöd Tests für die zu schreiben, die Abhängigkeiten werden verschleiert und Funktionen, die damit arbeiten, werden schlechter wartbar.
Das ist für cout aber egal, da es sich auf einer anderen "Schicht" befindet, nämlich im Standard. Ich brauche cout nicht debuggen, meine Funktionen können es nutzen ohne dass man sich Gedanken machen muss, dass wegen cout etwas nicht funktioniert, und die Abhängigkeit ist im Endeffekt zum großen Gebiet des Standards, die Schicht ist und bleibt dort.
Insofern ist in diesem Fall der Einsatz einer globalen Variable für cout kein Designfehler. Oder wo ist der konkrete Nachteil?
Und was das angeblich unlogische Verhalten der Streams bezeichnet: Ich schätze da einfach Mal, dass darauf angespielt wird, dass ein "Kaputtmachen" des Streams (also failbit/badbit) dazu führt, dass der Stream weiter genutzt werden kann, aber einfach nichts passiert.
Und dazu kann ich nur sagen: Das ist verdammt praktisch. Wer schon Mal einen Parser mit Streams geschrieben hat, dürfte wissen, was ich meine. Man muss nicht an jeder Stelle den Stream prüfen, ein paar definierte reichen aus. Und zwischenzeitlich braucht man kein UB erwarten und auch keine Exceptions fangen. Wenn man sich darauf einstellt, ist das eine sehr schöne Sache.
-
#include <iostream> using namespace std; int main() { ostream x(0); x<<"Hello blurry"<<endl; }Gibt zwar keinen Fehler, aber aufm Bildschirm erscheint da nix

-
#include <iostream> int main() { if (true) { std::cout << "Blurry sucks" << std::endl; } }Bei mir ist es genau andersrum! Es wird immer ausgegeben...
-
blurry:
Natürlich nicht, Du hast den Streambuf mit 0 initialisiert, was erwartest Du denn?
-
blurry333 schrieb:
#include <iostream> using namespace std; int main() { ostream x(0); x<<"Hello blurry"<<endl; }Gibt zwar keinen Fehler, aber aufm Bildschirm erscheint da nix

Warum auch? steht in Deinem Programm irgendwas von Bildschirm?
Versuche mal das:
#include <iostream> #include <streambuf> struct Foo : std::streambuf { protected: virtual int_type overflow( int_type m = traits_type::eof() ) { std::cout << "[" << traits_type::to_char_type( m ) << "]" << std::endl; return m; } }; using namespace std; int main() { Foo foo; ostream x(&foo); x<<"Hello blurry"<<endl; }Gruß
Werner
-
Eisflamme schrieb:
blurry:
Natürlich nicht, Du hast den Streambuf mit 0 initialisiert, was erwartest Du denn?ostream var(0)Was bedeutet denn eine Initalisierung mit 0 ?? Macht das Sinn ?
-
...