Logging
-
Mach dir klar, was die Verkettung der einzelnen operator<< bewirkt, und dann schau, was du in deinem operator<< zurückgibst! Dann wunderst du dich nicht mehr, warum nur der erste cout ankommt, der Rest nur ins file wandert
(padreigh hat es ja schon angedeutet)
-
Jup (schon wieder mißverständlich von mir geschrieben)..die Erklärung von meinem Vorgänger ist richtig.
stream << x << y << z; == (((stream << x)->rückgabe des streams << y)->rückgabe des streams << z);
Ich verstehe schon warum ich da Probleme habe.
ich finde nur keine sinnvolle Lösung für das Problem.
ich versuche gerade ein separates ostream-Objekt zu verwalten in der Klasse. Bisher falle ich da aber immer auf die Fresse.
-
du könntest ja mal Versuchen statt eines ostream& einen deiner Streams zurückzugeben ... <prodd> und vielleicht etwas ähnliches mite deinem filestream machen was du mit cout machst ...
-
HeroHolger schrieb:
Ich verstehe schon warum ich da Probleme habe.
ich finde nur keine sinnvolle Lösung für das Problem.
Wenn Du das IO von streams verändern möchtest, dann möchtest Du in der Regel eigene Stream-Buffer implementieren.
Folgendes benutzt keine Streambuffer, aber vielleicht findest Du es trotzdem hilfreich:
robitzki.de/log.h
robitzki.de/log.cppmfg Torsten
-
Ändere mal std::ostream& operator<<(const std::string &fString); zu std::ostream& operator<<(std::ostream& o, const std::string &fString);
std::ostream& cErrorLogStream::operator<<(std::ostream& o, const std::string &fString) { std::cout << fString << std::flush; if (!m_stream) { std::cout << "Error: cErrorLogStream --> m_stream==NULL\n" << std::flush; } *m_stream << fString << std::flush; return o; }
-
@Opi: das geht leider nicht, es darf nur eine Parameter in der Klammer stehen..zumindest laut meinem Compiler.
-
HeroHolger schrieb:
@Opi: das geht leider nicht, es darf nur eine Parameter in der Klammer stehen..zumindest laut meinem Compiler.
Diese Variante soll auch als freie Funktion implementiert werden.
-
Hi.
kannst du mal erklären was du unter einer freien Funktion verstehst?mfg
-
HeroHolger schrieb:
Hi.
kannst du mal erklären was du unter einer freien Funktion verstehst?Das ist eine Funktion, die nicht Member einer Klasse ist.
-
Wie soll ich ne Operator Methode ohne zugehörende Klasse programmieren? Das angeführte Beispiel geht dafür nicht.
Ne operator<< - Methode mit 2 Parametern erscheint grundsätzlich sehr fragwürdig. Das kann doch gar nicht gehen. ob nun außerhalb oder innerhalb einer Klasse definiert.
Sei es wie es sei..ich hab es probiert..der Compiler akzeptiert es nicht. Und ich sehe keinen logischen Sinn in so einer Methode.
-
Warum fragwürdig? Das ist es nämlich nicht. Und natürlich geht es.
Zeig doch einfach mal, was du ausprobiert hast und deine Fehlermeldung...
-
HeroHolger schrieb:
Ne operator<< - Methode mit 2 Parametern erscheint grundsätzlich sehr fragwürdig. Das kann doch gar nicht gehen. ob nun außerhalb oder innerhalb einer Klasse definiert.
Lies doch bitte mal den Artikel zur Überladung von Operatoren im Magazin
http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html
Punkt 3.4 ist für dich besonders interessant.
Dazu vielleicht auch noch
http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/
-
k wußte ich nicht.
Ich hab mir die links mal angeschaut...muss ich mal probieren.
Ich meld mich (vermutlich) morgen nochmal dazu.
-
Hab mir mal angeschaut was ihr meintet, aber das bringt irgendwie nichts.
Es ist doch anscheinend egal, ob ich den Shift-Operator außerhalb oder innerhalb der Klasse programmiere. Am Ende stehe ich immer noch vor dem Problem, dass ich ihn je nach Situation mal splitten muss oder mal einfach nur in die Datei ausgeben will.
mfg
Holger
-
(*sehnsüchtig an WernerSolomon denk*)
Ich glaube, hübsch wird es erst, wenn Du einen eigenen streambuf schreibst, der zwei andere streambufs besitzt und alle Ausgaben auf beide aufsplittet und Du einen ostream draufsetzt.
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1403536.html
-
genau das will ich aber nicht, weil diese Sache (std::cout automatisch in die Weiche schieben) programmweit gültig wäre und nicht nur lokal.
Pauschales Streamsplitting ist eben nicht das was ich will.
-
Dann willst du temporäres Streamsplitting?
http://www.c-plusplus.net/forum/viewtopic-var-p-is-842769.html#842769@volkard,
Die Forumsuche kann Werner Salomon heraufbeschwören
Grüssli
-
nein, ich will kein temporäres...ich möchte konkretes splitten..also nur wenn ich es brauche
log << "ich schreibe in cout" errlog << "ich schreibe in Datei und cout"; log << "ich schreibe in cout" errlog << "ich schreibe in Datei und cout";Das muss über zig Bibliotheken und u.U. auch threadsicher funktionieren.
-
Dann verwende die von volkard genannte Weiche auf dein
errlogund nicht aufstd::cout. Ist dir übrigens bewusst, dass es einstd::cerrgibt?Grüssli
-
Warum nicht gleich boost::log?