Logging im Kopierkonstruktor?



  • Hallo zusammen,

    da ich gern die Erstellung und "Zerstörung" meiner Objekte verfolgen möchte, habe ich in vielen Klassen Logausgaben in den Konstruktoren und Destruktoren eingebaut.

    Nun werden bei vielen meiner Objekte die Destruktoren-Logs geschrieben, ohne dass es entsprechende Konstruktoren dafür gibt. Daher gehe ich davon aus, dass diese über Kopien und den Copy-Konstruktor erstellt wurden.

    Die Kopierkonstruktoren hat alle der Compiler erstellt, ich habe keinen selbst implementiert. Wie kann ich denn nun Logausgaben in die Kopierkonstruktoren einfügen, ohne deren Verhalten zu beeinflussen? Gibt es so etwas ähnliches wie sie super.()-Aufrufe in Java (obwohl wir hier ja keine Basisklassen) haben?

    Leider habe ich noch nichts im Web oder hier dazu gefunden.

    Vielen Dank schon mal vorab!

    Ciao



  • Warum hast du einen Destruktor aber keinen Kopierkonstruktor (Stichwort 3/5/0er Regel)?
    Was erwartest du von der Loggerei?



  • Destruktor - zum Loggen und Aufräumen ggf. mit new angelegter Objekte.

    Kopierkonstruktor habe ich keinen eigenen gebraucht.
    Vom Loggen verspreche ich mir die Nachvollziehbarkeit meiner Vermutung, da ich mir die Adressen meiner Objekte ausgeben lasse.

    Leider bin ich nach wie vor blutiger C++ Anfänger und tue mich mit der Sprache und ihren Möglichkeiten extrem schwer. Die 3/5/0er Regel sagt mir noch nichts, muss ich mich erst noch aufschlauen.



  • manni66 schrieb:

    Warum hast du einen Destruktor aber keinen Kopierkonstruktor (Stichwort 3/5/0er Regel)?

    Gerade ein solches Logging ist ein Beispiel dafür, dass es auch Ausnahmen von den 3/5/0-er-Regeln geben kann.
    Da hier kein "Aufräumcode" für gehaltene Ressourcen ausgeführt wird und der Destruktor nur dazu dient festzustellen,
    wann/ob der Destruktor aufgerufen wurde ist es also nicht unbedingt notwendig, diese Regeln zu beachten, damit sich
    das Objekt "vernünftig" verhält.

    Allerdings...

    manni66 schrieb:

    Was erwartest du von der Loggerei?

    ... sollte man sich dann auch nicht wundern, wenn es nicht zu jedem Destruktor-Aufruf einen entsprechend geloggten
    Konstruktor-Aufruf gibt. Das hat schon so seine Richtigkeit 😉



  • Reth schrieb:

    Destruktor - ... Aufräumen ggf. mit new angelegter Objekte.

    1. verwende std::unique_ptr statt selber aufzuräumen
    2. wenn du dennoch selbst verwalten willst, gilt hier die Regel



  • Ok, bezogen auf mein Thema zum Loggen der Instanzen sehe ich noch nicht, dass man alle 3 benötigt. Zudem habe ich auch Destruktoren, bei denen ich "nur" logge und keine Aufräumarbeiten habe.

    Also entnehme ich dem mal, dass ich die Copy-Konstruktoren ebenfalls implementieren muss, wenn ich Logausgaben für das Erzeugen aller möglichen Instanzen benötige.



  • Reth schrieb:

    Also entnehme ich dem mal, dass ich die Copy-Konstruktoren ebenfalls implementieren muss, wenn ich Logausgaben für das Erzeugen aller möglichen Instanzen benötige.

    Ja. Ist doch ganz einfach: Wenn du alle erzeugten Objekte loggen willst, dann müssen alle Konstruktoren loggen. Und wenn ein Copy-Ctor automatisch erzeugt wird, dann loggt der nicht. Also hättest du ein Problem. Also musst du den Copy-Ctor selbst implementieren.

    Du kannst allerdings eine Hilfsklasse z.B. als Basisklasse verwenden die das loggen übernimmt. Dann musst du nur in dieser den Copy-Ctor und Dtor implementieren und dort loggen. Wenn du dabei je nach abgeleiteter Klasse unterschiedliche Meldungen ausgeben willst, dann kannst du diese Hilfsklasse z.B. als Template ausführen.



  • Reth schrieb:

    Gibt es so etwas ähnliches wie sie super.()-Aufrufe in Java (obwohl wir hier ja keine Basisklassen) haben?

    Hat zwar mit dem Rest deiner Frage irgendwie nichts zu tun, aber ja:

    BaseClass::f(); // == super.f();
    BaseOfBaseClass::f(); // kann java glaube ich nicht
    


  • Hilft leider auch nicht, denn der OP will das ja eigentlich gar nicht. Er will eigentlich, wenn ich das richtig verstanden habe, den Code aufrufen den ein = default Copy-Ctor enthalten würde. Was soweit ich weiss nicht geht.


Anmelden zum Antworten