<dynamic_cast> und std::shared_ptr



  • Hallo liebe Community!

    Ich brauche relativ dringend Hilfe.

    nämlich ich checke nicht wofür man dynamic_cast und sharedptr genau braucht für Anwendungen in Praxis. Klar hier und da mache ich meine Aufgaben von Uni aber das ist so bissel unpraktisch, um mir vorzustellen wofür. Hat jemand gute Metaphern für mich hierbei? Ich verstehe es besser, mit gewissen Vergleichen. Z.B , habe es auf Anhieb geblickt, als ich mir vorstellte, dass ein Copy-Constructor für Computerspiele verwendet werden kann, in dem die Copy-Const. Spieler Atrributen erweitert usw.

    Die andere Fragen sind: Für mich funktionieren dynamic cast und shared ptr all zu ähnlich. Gibt es Fälle wo man sie unterschiedlich einsetzen soll?

    Ich habe neulich was codiert eine relativ bekannte und übliche Aufgabe von Shape- ihre abgeleiteten Klassen wie Circle, Rectangle , usw........... dafür habe ich auch, std::set verwendet.
    :

    *namespace CAD
    {
    class CAD_Drawing
    {
    private:
    std::set<Shape
    > setShapes_;

    public:
    	CAD_Drawing();
    	~CAD_Drawing();
    	void vAddShape(Shape*);
    	void RemoveShape(Shape*);
    	void vDrawIt(void);
    };
    

    }

    Ist CAD als Interface.

    Dann Shape als Base class:

    ***namespace CAD
    {
    class Shape
    {
    private: protected:
    static uint32_t u32NumberOfInstances_c;

    public:
    	Shape();
    	virtual ~Shape();
    	static uint32_t u32GetNumberOfInstances(void);
    	void virtual vDraw(void) = 0;
    };
    

    }****

    Mein Ursprunglicher Gedanke war: wenn man shape_ptr einsetzen will, dass es in int main(void) Funktion gehen soll , z.B wie diese:

    std::shared_ptrCAD::Shape sp{ new CAD::Circle };

    Oder mit std::make_shared :

    std::shared_ptrCAD::Shape sp{ std::make_shared<CAD::Circle >()};

    In meiner Aufgabe ist jedoch verlangt, shared_ptr einzusetzen, in Klassen, sodass Polymorphismus erhalten bleibt....

    Entweder ist mein Wissen in C++ zu bescheiden dass ich nicht check was der Aufgabensteller möchte oder ist die Frage: Erweitern Sie das Projekt durch den Einsatz von shared_ptr! all zu ungenau formuliert? Oder blickt jemand hier durch was der Prof von mir will ? ^^;;

    Über Antworten wäre ich echt dankbar, und wunderschöne Feiertage an besten Engineers, die über Feiertage büffeln müssen 👩🏻


  • Mod

    dynamic_cast und shared_ptr haben nichts miteinander zu tun. Da du nicht wirklich erklärst, wo du überhaupt Ähnlichkeiten siehst, kann man auch nicht genauer erklären, was du falsch verstehst.

    shared_ptr ist ein Konzept der Speicherverwaltung und -verantwortung. Das kann - unter anderem - auch ganz gut benutzt werden, um Polymorphismus zu erzeugen.

    dynamic_cast ist überhaupt gar nichts, was man jemals brauchen sollte. Es ist eher etwas um Designfehler auszubügeln, wenn jemand bei Polymorphie ganz großen Mist gebaut hat.



  • Hi @SeppJ , danke dir. Ich konnte mich seit dem letzten Login irgendwie nicht mehr mit meinerm Account anmelden, daher musste ich zur Not nun nen anderen Account schaffen^^ bin die identische wie AmigaC.

    Also meine Frage war sehr ungünstig formuliert: Es geht darum dass ich shared_ptr mal verwendet habe, um in Ponlymorphismus einen Zeiger auf ein Objekt der Kindklasse zu erzeugen, der eigentlich von Elternklasse ist. Aber das geht ja eben mit dynamic cast auch?

    Grundsätzliche Funktionensweisen der dynamic cast und shared ptr verstehe ich. Aber in dem speziellen Fall??
    Beispiel:

    int main(void)
    {
    Father* pFather1 = new Father();
    Father* pFather2 = new Child();
    Child* pChild1 = dynamic_cast<Child*>(pFather1);
    Child* pChild2 = dynamic_cast<Child*>(pFather2);
    ....
    }

    Und dafür mit shared z.B:

    std::shared_ptr<Father> pFather1 = new Father();
    std::shared_ptr<Father> pFather(std::make_shared<Child >());

    Father* pFather = new Child{};
    std::shared_ptr<Father> sp{ pFather };

    Alle Varianten sollten die Objekte der Kindklassen speichern in Zeiger der Elternklasse.
    Wenn ich ehrlich bin find ich synamic cast für diesen Fall allein sehr viel intuitiver.

    Aber Designfehler ausbügeln trifft mal zu bei casten 😃



  • Hä?



  • Hmm war es allzu unverständlich?
    Vielleicht blick ich nix durch? @hustbaer?

    Ich würd das im privaten Chat fragen aber es gibt für mich irgendwie keine Berechtigung dafür besagt die Meldung



  • @AmigaB sagte in <dynamic_cast> und std::shared_ptr:

    Alle Varianten sollten die Objekte der Kindklassen speichern in Zeiger der Elternklasse.

    Das sind keine Varianten. dynamic_cast "castet" oder konvertiert. Damit kannst du prüfen, ob das Objekt das ist, was du vermutest. Das erzeugt keine Objekte. Sollte man normalerweise gar nicht brauchen/benutzen.



  • Okey, jetzt hab ich es kapiert.... danke dass dynamic cast eben keine Objekte anlegt oder verschiebt etc.

    Tausend Danke! Jetzt kann ich weiter 😵 😇


Anmelden zum Antworten