objekt in klasse anlegen und automatisch wieder den speicher freigeben



  • hi,
    wie kann ich in einer klasse ein objekt einer anderen klasse anlegen, so das ich von alle methoden drauf zugreifen kann und der speicher für das objekt auch beim zerstören wieder automatisch freigegeben wird?



  • An sich ist das nicht schwer.
    Das geht genau so, wie bei einer normalen Variablen:

    class MyClass {
    private:
        MyOtherClass m_object;
    };
    


  • danke erstmal, aber wie mache ich das wenn mein objekt was ich anlegen will gleich argumente übergeben will also das objekt einen eigenen konstruktor hat?



  • class foo
    {
      ...
    public:
      explicit foo(int);
    };
    
    class bar
    {
      foo f;
    public:
      bar()
      : f(1729) {}
    };
    


  • super ich glaube das is genau das was ich gesucht habe



  • das hat so alles gut geklappt nun habe ich aber ein neues problem. ich habe zwei objekte die ich initialisieren muss aber eins hängt vom anderen ab. wie mache ich das?

    class foo{
        bar1 b1;
        bar2 b2; // ist von b1 abhängig
    public:
        foo() : b1(42), b2(b1.data()) {}
    };
    

    wie initialsieren ich b2 am besten damit bei zerstörung von foo auch der speicher für b2 freigegeben wird??


  • Mod

    gotohome schrieb:

    das hat so alles gut geklappt nun habe ich aber ein neues problem. ich habe zwei objekte die ich initialisieren muss aber eins hängt vom anderen ab. wie mache ich das?

    class foo{
        bar1 b1;
        bar2 b2; // ist von b1 abhängig
    public:
        foo() : b1(42), b2(b1.data()) {}
    };
    

    wie initialsieren ich b2 am besten damit bei zerstörung von foo auch der speicher für b2 freigegeben wird??

    Da gibt's keinen Unterschied zu einem Objekt, das passiert alles genau gleich. Das einzige worauf du aufpassen musst ist die Reihenfolge der Initialisierung, bei gegenseitiger Abhängigkeit. Diese geschieht nämlich so wie die Objekte in der Klasse deklariert sind, nicht in der Reihenfolge in der Initialisierungsliste. So wie du es jetzt hast, ist es schon richtig:

    class foo1{
        bar1 b1;
        bar2 b2;
    public:
        foo() : b1(42), b2(b1.data()) {}  // Ok, erst b1, dann b2(b1.data())
    };
    
    class foo2{
        bar1 b1;
        bar2 b2;
    public:
        foo() : b2(b1.data()), b1(42) {}  // Sieht komisch aus, aber ok. das gleiche wie foo1
    };
    
    class foo3{
        bar2 b2;
        bar1 b1;
    public:
        foo() : b1(42), b2(b1.data()) {}  // Oh, nein! b2 wird mit b1.data() initialisiert, aber b1 gibt es noch nicht!
    };
    
    class foo4{
        bar2 b2;
        bar1 b1;
    public:
        foo() : b2(b1.data()), b1(42) {}  // So natürlich auch nicht. siehe foo3
    };
    


  • vielen vielen dank


Anmelden zum Antworten