Zeiger auf "parent" und Stackvariable



  • Hallo!

    Ich habe folgendes Konstrukt:

    class Foo { 
       vector<Bar> mBars;
     };
    
    class Bar {
       Foo* mParentFoo;
       Bar(Foo* f) : mParentFoo(f) { }
    }
    

    Ein Foo hält also mehrere Bar Objekte und jedes Bar Objekt hat einen Zeiger auf seinen "Parent" Foo.

    Jetzt will ich Foo Objekte erzeugen:

    class Creator {
       vector<Foo> mFoos;
    
       void create() {
          ...
          Foo foo;
          for(...) {
              Bar bar(&foo); // ???
              foo.mBars.push_back( bar );
          }      
    
          mFoos.push_back( foo );
       }
    }
    

    In create() will ich ein Foo erzeugen und es in einen vector pushen. Das Foo bekommt mehrere Bars.
    Mein Problem ist jetzt in der Zeile mit dem Kommentar. Jedes Bar kriegt ja einen Zeiger auf sein Parent Foo. Nur liegt das Parent Foo an dieser Stelle ja auf dem Stack und somit kann ich nicht die Adresse &foo benutzen.
    Wäre es eine Lösung wenn ich das Foo zuerst in den vector mFoos pushe und mir dann die Adresse aus dem vector hole und an den Bar Ctor übergebe? Bessere Lösungen?


  • Mod

    Du wirst Foo einen eigene Kopier- und gg.f Move-konstruktor spendieren müssen, der die parents nach dem Kopieren von mbars entsprechend anpasst.
    Die Anzahl der nötigen Kopien/Moves zu minimieren ist nat. auch eine gute Idee, aber für sich alleine genommen nicht robust.

    ungefähr so:

    class Foo;
    
    class Bar {
       friend class Foo;
       Foo* mParentFoo;
       Bar(Foo* f) : mParentFoo(f) { }
    }
    
    class Foo {
       vector<Bar> mBars;
       Foo(const Foo& other)
           : mBars(other.mBars)
       {
           for ( auto& x : mBars )
               x.mParentFoo = this;
       }
     };
    

    gib nat. noch andere Probleme, denn eigentlich sollten Bars nicht einfach so kopierbar sein (da Kopien ja nicht automatisch ein parent haben).



  • Schon mal Danke für den Hinweis camper!

    Prinzipiell hast du natürlich recht. Aber könnte ich mir einen selber geschriebenen Foo Ctor nicht auch sparen, wenn ich in create() gleich am Anfang das noch leere Foo Objekt in den vector mFoos pushe, mir eine Referenz auf das Element im vector hole und dann nur über diese Referenz das Foo mit Bars befülle?

    Die Parent-Zeiger sollten doch dann solange gültig sein, solange es die Klasse Creator gibt, oder?



  • askii schrieb:

    Die Parent-Zeiger sollten doch dann solange gültig sein, solange es die Klasse Creator gibt, oder?

    Nö. Der Vector schiebt bei Einfügungen seine Bars nach Bedarf im Speicher herum.


Anmelden zum Antworten