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