[boost::shared_ptr] *** downcast, wie?



  • Hallo, folgendes Problem:

    struct Basis {virtual ~Basis(){}  };
    struct Derived : public Basis {};
    
    int main()
    {
        Basis* ptr = new Derived();
        Derived* ptrDerived = dynamic_cast<Derived*>(ptr);
    }
    

    so und wie funzt das analog mit:

    boost::shared_ptr<Basis> ptr(new Derived);
       boost::shared_ptr<Derived> ptrDerived = dynamic_cast<Derived*>(ptr); //<-funzt natürlich nicht!  :rolleyes:
    

    gruß, SirAnn



  • Gibt es keine Methode, die den Pointer zurückliefert? Gleich mal gucken.

    Edit: Entweder shared_ptr::get() oder get_pointer(shared_ptr&)

    Aber für dich das richtige ist wohl eher:

    dynamic_pointer_cast

    template<class T, class U>
    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r);
    Requires: The expression dynamic_cast<T*>(r.get()) must be well-formed and its behavior defined.

    Returns:

    When dynamic_cast<T*>(r.get()) returns a nonzero value, a shared_ptr<T> object that stores a copy of it and shares ownership with r;
    Otherwise, an empty shared_ptr<T> object.
    Throws: nothing.

    Notes: the seemingly equivalent expression

    shared_ptr<T>(dynamic_cast<T*>(r.get()))

    will eventually result in undefined behavior, attempting to delete the same object twice.

    Von http://www.boost.org/libs/smart_ptr/shared_ptr.htm#Members



  • ahh, ich blinder vollhonk... bin etwas überarbeitet und habe gleich google bemüht ohne in der references zu schauen. ein noob-fehler... aber was soll's.

    1000 dank. das haut natürlich hin...

    aber der vollständigkeit halber:

    so geht's:

    boost::shared_ptr<Derived> ptrDerived = boost::dynamic_pointer_cast<Derived>(ptr);
    

    wie gewohnt ist eben ptr.get()==NULL, wenne s nicht geklappt hat bzw !ptr==true


Anmelden zum Antworten