Was bedeuted folgende Defintion "struct Foo::Bar{ ...} " ?



  • Hallo Leute,

    ich bin auf folgende Code gestoßen (pseudo);

    //Foo.h
    class Foo
    {
    ....
    
    private:
    
      struct Bar;
      Bar& m;
    ...
    };
    
    

    und cpp:

    struct Foo::Bar
    {
      Bar()
        : iwas(0)
    
      {
      }
    
     int iwas;
    }
    
    Foo::Foo()
      : m(*new Bar)
    {
    }
    
    

    diesen Konstrukt verstehe ich gar nicht 🤫 !? was wir da gemacht mit dem Bar in Foo?

    Danke für die Auflösung;)



  • @SoIntMan Bar wird innerhalb Foo definiert. Deshalb wird Foo so ähnlich wie ein namespace vorangestellt.



  • Der Sinn dahinter ist das PIMPL-Idiom. Und an dem C++ Beispiel dort sieht man auch, daß hier besser ein Smartpointer benutzt werden sollte (denn sonst bräuchte man hier ja noch einen Destruktor für Foo, um den Bar-Zeiger mwieder freizugeben).



  • Ahhh ok .... "click" ... das bedeutet der struct member is ein "anonymer" platzhalter eines members der nur in der cpp sinn ergibt.

    Glaub im echten beispielt wird das ding auch wieder zerstört.. ich war nur verwirrt durch das "Foo::Bar"....

    Dank Leute



  • Ich muss sagen, dass mich die "besitzende Referenz" hier am meisten irritiert.

    Ich finde das hat schon ein höheres Fehlerpotential, da ich nicht vermuten würde, eine solche Variable mit delete std::addressof(m) freigeben zu müssen, wenn ich sie sehe. Bei nem Pointer schaue ich da zumindest etwas genauer hin.

    Ich zwar, dass man das so machen kann, halte es aber dennoch für reichlich unorthodox. Zumindest in dem Code, mitd em ich zu tun habe ist mir das jedenfalls noch nicht in dieser Form untergekommen.



  • @Finnegan sagte in Was bedeuted folgende Defintion "struct Foo::Bar{ ...} " ?:

    ch muss sagen, dass mich die "besitzende Referenz" hier am meisten irritiert.

    Ja das hat mich aus gefundert.. habe nachgeschaut im ctor steht :

    Foo::~Foo() 
    {
    delete &m;
    }
    

    warum kein pointer verwendet wurde verstehe ich auch nicht wirklich



  • Wenn man innerhalb von Foo auf Member von m zugreifen will, dann ist m.X besser zu lesen (und zu schreiben) als m->X (außerdem wird damit versichert, daß es keinen Nullzeiger geben kann, d.h. das Objekt immer existiert).
    Hat aber auch den Effekt, daß damit Foo nicht mehr automatisch kopierbar ist (ob Nachteil oder Vorteil kommt also drauf an).
    Trotzdem empfehle ich aber weiterhin hier einen Smartpointer zu benutzen (eine Smartreference gibt es so wohl leider nicht).



  • @Th69 sagte in Was bedeuted folgende Defintion "struct Foo::Bar{ ...} " ?:

    Wenn man innerhalb von Foo auf Member von m zugreifen will, dann ist m.X besser zu lesen (und zu schreiben) als m->X (außerdem wird damit versichert, daß es keinen Nullzeiger geben kann, d.h. das Objekt immer existiert).

    Trotzdem macht das niemand. Referenzen als Member sind sowieso schonmal unüblich. Und "besitzende Referenzen" hab ich in meinen > 20 Jahren als C++ Programmierer glaube ich noch nie gesehen - kann mich zumindest nicht erinnern. Technisch gesehen mag es OK sein. Aber es ist eine massive POLA/POLS Verletzung. Wer sowas unterrichtet sollte mMn. sofort entlassen werden.

    Hat aber auch den Effekt, daß damit Foo nicht mehr automatisch kopierbar ist (ob Nachteil oder Vorteil kommt also drauf an).

    Wenn das so wäre, dann wäre es ja gut. Weil man vermutlich nicht will dass die Klasse kopierbar ist - zumindest nicht mit einem implizit definierten Kopierkonstruktor. Ist aber halt nicht so, die Klasse bleibt weiterhin kopierbar. Einzig der Zuweisungsoperator wird nicht mehr implizit definiert. Das kann man aber auch erreichen indem man ein T* const Member verwendet.

    Trotzdem empfehle ich aber weiterhin hier einen Smartpointer zu benutzen

    +1


Anmelden zum Antworten