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 Anwendung

    den ultimativen stream-multithread-logger zu bauen.


Anmelden zum Antworten