Polymorphes objekt weitergeben



  • Ich hab eine abstrakte Klasse Root, diese ist primär für Polymoprhie da, um also von Root abgeleitete Klassen RootA, RootB gleich behandeln zu können.

    Nun habe ich folgendes Szenario:

    Klasse A generiert in Methode (1)A_1 eine Meldung (Root) und gibt diese an Methode (2)A_2 weiter. A_2 gibt die Meldung an Klasse B weiter, an die Methode (3)B_A.

    Nun hab ich ein kleines Problem mit dem durchgeben der Variable.

    In (1) als in A_1 erzeuge ich einen Pointer vom Typ Root, weil A_1 entscheidet ob dort ein RootA, RootB usw rein kommt.

    void A::A_1(){
    Root * r = new RootA();
    }
    

    Aber das Problem was ich jetzt habe, ich muss nun diese Var irgendwie an A_2 weiter geben.

    void A::A_1(){
    Root * r = new RootA();
    
    A_2(r);
    }
    
    void A::A_2(Root * r){
    }
    

    Diese Methode hat nur die Aufgabe es an andere Klassen zu vergeben, in diesem Fall nur an B (in wirklichkeit verteilt es an mehrerem daher eine extra Methode)
    B fängt diesen Pointer und verarbeitet ihn dann.

    void A::A_1(){
    Root * r = new RootA();
    
    A_2(r);
    }
    
    void A::A_2(Root * r){
    
     B->B_1(r);
    }
    
    void B::B_1(Root * r){
     // Verarbeiten von r
    }
    

    Doch somit habe ich doch ein Problem oder? Polymorphie klappt nur mit Pointern, so wie oben beschrieben, aber dass bedeut doch, dass in r gelöscht werden muss.
    Aber von wem? Sollte A_1 nach dem Aufruf von A_2 den Pointer wieder zerstören? Is das der gängige Weg? B kann es ja schlecht machen, wenn mehrere Instanzen von B angesprochen werden, führt das zu üblen Ergebnissen 🙂



  • wenn du dir sicher sein kannst, dass dein A ein exemplar von Root erzeugt, es an diverse andere objekte delegiert und dieses exemplar danach nicht mehr benötigt wird, kannst du es in die tonne treten. wenn du dir darüber nicht sicher bist, solltest du sowas wie boost::shared_ptr verwenden.



  • Hi,
    ich kann leider kein boost nutzen, nur die Standard Libs und STL



  • dann wär vielleicht ne art singleton pattern dafür geeignet.

    pseudo code:

    class RootController
    {
      static Root* root;
      int instancecounter;
      Root* request()
      {
        ++instancecounter;
        return root;
      }
      void release()
      {
        --instancecounter;
        if(instancecounter == 0)
          delete root;
      }
    }
    


  • Stimmt, das könnte klappen, ich muss nur sichergehen, dass ich der letzte Zugreifer auch den Delete aufruft, ansonsten muss B sich das Ding kopieren, wenn es die Var weiter braucht


Anmelden zum Antworten