Logging
-
Ä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?
-
Die WS Streamweiche hat er schon in Post 4 angeboten bekommen (und abgelehnt)

-
padreigh schrieb:
Die WS Streamweiche hat er schon in Post 4 angeboten bekommen (und abgelehnt)

aber da (vrmtl) auch nur, weil er dachte, er müsse sie auf std::cout anwenden.
-
das mit std::cerr könnte klappen. Das probiere ich mal die Tage.
ich teste gerade log4cxx (bin bisher aber nicht begeistert)
mfg
-
Ich hab das jetzt mal versucht zu realisieren..aber es klappt noch nciht so ganz.
ich nutzte die aus dem anderen Forum bekannte Weiche als Klasse cWeiche!
class cLogStream { public: cLogStream(std::ofstream *fOStream); std::ostream& operator<<(const std::string &fString); protected: std::ofstream * m_stream; cWeiche m_Weiche; };cLogStream::cLogStream(std::ofstream *fOStream) : m_stream(fOStream), m_Weiche(std::cerr, *fOStream) { }; std::ostream& cLogStream::operator<<(const std::string &fString) { if (!m_stream) { std::cout << "Error: cLogStream --> m_stream==NULL\n" << std::flush; } return *m_stream << fString << std::flush; }jetzt nutze ich die Klasse im Main wie folgt
{ std::ofstream *aStream=nLog::getFileStream("holgers.log"); nLog::cLogStream mStream(aStream); std::cerr << "1\n" ; std::cerr << "2\n" ; std::cerr << "3\n" ; std::cerr << "4\n" ; mStream << "5\n"; mStream << "6\n"; mStream << "7\n"; mStream << "8\n"; mStream << "9\n"; std::cerr << "10\n" << std::flush ; std::cerr << "11\n" << std::flush; }Auf dem bildschirme rscheint nun, wie gewollt
1
2
3
4
10
11aber in der Datei erscheint nur
1
2
3
4
5
6
7
8
9In der Datei fehlen die Ausgaben 10 und 11
Hat jemand eine Idee?