Was passiert mit diesen anonymen Objekten?
-
Servus,
was passiert eigentlich, wenn man ein anonymes Objekt daklariert und darauf was macht?
Hintergrund ist eine Klasse, die zum konstruieren von Logmessages dient und dafür einen komfortablen Stream-Mechanismus bereitstellt:
class Log { public: Log(); static Log& Info(Log& log); //... static Log& endl(Log& log); //.... Log& operator<<(const std::string& s); Log& operator<<(Log& (*f)(Log&)); private Writer& m_writer; std::ostringstream m_stream; };Der Trick bei der Klasse ist, dass sie eigentlich nur den Stream zusammenbastelt und dann das Ergebnis an den Writer postet, der es wiederum in eine Threadsafe-Queue einfügt, um es dann später wegeschreiben zu können.
Damit das funktioniert, muss ich für jeden Logeintrag ja ein Objekt vom Typ Log erzeugen:
Log() << Log::Info << "Das ist eine Info message " << 42 << Log::endl; Log() << Log::Error << "Das ist ein Error:" << 3.14159 << Log::endl;Was passiert mit diesen anonymen Objekten? Leben die solange wie der Scope einer lokalen, nicht-anonymen Variable wäre?
Gruß,
Phil
-
PhilippM schrieb:
Was passiert mit diesen anonymen Objekten? Leben die solange wie der Scope einer lokalen, nicht-anonymen Variable wäre?
Nein. Temporäre Objekte leben nur innerhalb des Ausdrucks, in dem sie ausgewertet werden. Nach dem ; wird also der Destruktor aufgerufen, das zweite
Log()erstellt ein neues Objekt.Ausnahmen sind temporäre RValues, die zur initialisierung von lokalen Const-Referenzen verwendet werden. Diese besitzen die Lebensdauer der Referenz selber.
-
Danke, das wollte ich wissen

-
PhilippM schrieb:
Der Trick bei der Klasse ist, dass sie eigentlich nur den Stream zusammenbastelt und dann das Ergebnis an den Writer postet, der es wiederum in eine Threadsafe-Queue einfügt, um es dann später wegeschreiben zu können.
PhilippM schrieb:
Log() << Log::Info << "Das ist eine Info message " << 42 << Log::endl;Das ist aber hübsch. Sowas könnte ich auch für die Konsole brauchen, damit sich die Ausgaben der Threads nicht mehr Zeichenweise mischen, sondern Programmierzeilenweise.
-
volkard schrieb:
...damit sich die Ausgaben der Threads nicht mehr Zeichenweise mischen, sondern Programmierzeilenweise.
LOL.
Ich versuche, aus diesen beiden Klassen:
Loggen mit Stream
Log-System in einer multithreaded Anwendungden ultimativen stream-multithread-logger zu bauen.