Objekt, das sich selbst loescht



  • Ich habe einen Container, der Objekte, von einer gemeinsamen ABC enthaelt.
    Wenn in einem dieser Objekte ein bestimmter Fall eintritt, soll dieses durch eine von der ABC abgeleitete Instanz ersetzt werden.
    Wie loese ich das am geschicktesten?



  • boost::shared_ptr ?



  • Geht das auch ohne?
    Hab grad kein boost hier....



  • Ich wüsste jetzt auch nicht, wie ein boost::shared_ptr dabei helfen sollte.

    @vielleicht... und alle, die das Problem sonst noch nciht verstanden haben:

    Das ganze sieht wohl so aus:

    class ABC {
    public:
       virtual void foo () = 0;
    };
    
    class Bar : public ABC {
    public:
       virtual void foo ()
       {...}
    };
    
    class Baz : public ABC  {
    public:
       virtual void foo () 
       {
           if (spezialfall)
              // diese Instanz soll im Container durch eine Bar-Instanz ersetzt werden
       }
    };
    
    Container<ABC *> container;
    


  • Das heißt, jedes deiner Objekte müßte die Kontainerklasse kennen, und diese dann mittels Callback daran erinnern, da es zerstört werden möchte, und idealerweise kreiert es gleich, eine neue Instanz, die es dem Callback zum inserten mitgiebt.



  • Wie wär's, wenn Du eine Klasse dazwischenschiebst?

    Also sozusagen einen Proxy der im Container drinsitzt und einen Pointer auf die eigentliche Klasse enthält. Dann kannst Du dadrin bequem austauschen, ohne daß der Container sich ändern muß.

    MfG Jester



  • @Helium: _haargenau_

    @Jester: Geile Idee 😃



  • Und dass foo() ein Base* zurückgibt, das im Normalfall this und im Sonderfall eine neue Instanz zurückgibt, geht nicht?



  • @Jester:
    Ich habe jetzt bei der konkreten Umsetzung der Proxy Klasse ein Problem.
    [cpp]class ABC
    {
    public:
    ...
    int machWas() { return a; }; //non-virtual!

    protected:
    int a;
    };

    class Bar : public ABC
    {
    protected:
    int a;
    };

    class Baz : public ABC
    {
    protected:
    int a;
    };

    class Proxy : public ABC
    {
    public:
    //generates_error:int machWas() { return Baz.a; };
    protected:
    Baz wird_normalerweise_genommen;
    Bar wird_genommen_wenn_spezialfall_eintritt;
    }

    [/cpp]
    Da ich ja eine ABC habe, muss ich ja nun alle Funktionen fuer meine Proxy Klasse "umbiegen". Da aber mehrere Funktionen in der ABC non-virtual sind, weiss ich nicht so ganz, was ich nun mit diesen Funktionen in der Proxy class machen soll. Die Funktionen umaendern zu virtual will ich eigentlich nicht.
    Was sollte ich jetzt am geschicktesten machen?


Anmelden zum Antworten