Wie Smartpointer erzwingen?



  • Hi! Ich programmiere gerade an einer Library in der ich ausschliesslich Smartpointer benutze, unter anderem den boost::shared_ptr. Wie das so ist komme ich irgendwann an einen Punkt wo ich auch this irgendwo übergeben muß. Und das mache ich mit der shared_from_this()-Methode von boost::enable_shared_from_this.

    Problem: wenn man ein Objekt mit einem Rawpointer instanziert (oder auf dem Stack), dann wirft shared_from_this() eine bad_weak_ptr Exception. Berechtigterweise!

    Wie kann ich also einen Benutzer meiner Library dazu zwingen ganz bestimmte Klassen nur mit den boost-Smartpointern zu instanzieren?

    Ich könnte natürlich eine Factory machen, die immer eine Instanz per Smartptr liefert. Aber die Factory wäre ja dann immer noch freiwillig. Habt ihr da eine Idee?

    Gruß
    Artchi

    Links: http://www.boost.org/libs/smart_ptr/sp_techniques.html#from_this



  • Artchi schrieb:

    Ich könnte natürlich eine Factory machen, die immer eine Instanz per Smartptr liefert. Aber die Factory wäre ja dann immer noch freiwillig. Habt ihr da eine Idee?

    Freiwillig?

    class FooFactory;
    
    class Foo
    {
      friend class FooFactory;
    // ...
    private:
      Foo();
    };
    


  • Hem, funktioniert Foo dann noch mit shared_ptr? ARGH! Ich glaub ich hab mir da selber einen Denkfehler gesetzt. Ich hab die ganze Zeit an den Copy-Konstruktor gedacht. Aber wenn ich z.B. den Standard-Ktor private setze, funktioniert der Copy-Ktor trotzdem und somit der shared_ptr.

    Werde ich mal heute abend zu Hause ausprobieren. Ich hätte es einfach mal probieren sollen. 😉 😃

    Danke dir!



  • Artchi schrieb:

    Ich hab die ganze Zeit an den Copy-Konstruktor gedacht. Aber wenn ich z.B. den Standard-Ktor private setze, funktioniert der Copy-Ktor trotzdem und somit der shared_ptr.

    Mein Post war nur ein Denkanstoß 😉

    FooPtr bar = FooFactory::createFoo();
    Foo* myBad = new Foo(*bar);
    Foo oops = *myBad;
    

    Von daher würde ich den Copy-C'tor genauso private machen, ggf einfach nur "abschalten".

    Der shared_ptr ist zwar CopyConstructible & Assignable, kopiert aber selbst nur Pointer...


Anmelden zum Antworten