Smartpointer: Upcast Problem



  • Hi, ich habe 2 Klassen:

    A{B*}
    und
    B:A{A*[]}

    Also A besitzt einen "Pointer" auf B, und B wiederum kann ganzviele Instanzen von A halten.
    Nun möchte ich das ganze mit Smartpointer realisieren (mit normalen Pointern funktioniert es bereits):

    class B;
    class A
    {
       boost::weak_ptr<B> parent;
    };
    class B:public A
    {
       std::vector<boost::shared_ptr<A> > children;
    };
    

    Nun habe ich folgendes getestet:

    boost::shared_ptr<A> shared_parent(new B);// soll ein als kind gespeichertes B darstellen
    boost::weak_ptr<B> weak_parent= shared_parent;// soll den Parentverweis in A selber simulieren.
    

    Aber natürlich klappt das so nicht, der Compiler meldet eine "Invalid conversion from A* to B*",
    womit er ja auch recht hat. Nur wie mach ich das dann mit smartpointern?
    Eine Lösung wäre aus dem B* in A ein A* zu machen, was aber dann im Design zu einer Schwäche führt,
    und ich deshalb eigentlich nicht will.
    Also, wie kann ich es erreichen, das aus eine sh<A> ein weak<B> wird?

    Problem gelöst, mit dynamic_pointer_cast gehts:

    boost::shared_ptr<A> shared_parent(new B);// soll ein als kind gespeichertes B darstellen
    boost::weak_ptr<B> weak_parent= boost::dynamic_pointer_cast<Parent,base>(shared_parent);// soll den Parentverweis in A selber simulieren.
    shared_parent.reset();
    if(weak_parent.expired())
       std::cout << "Pointer expired" << std::endl;
    else
       std::cout << "Pointer valid" << std::endl;
    

    phlox


Anmelden zum Antworten