reinterpret_cast



  • Hallo,

    Das ist das erste Mal, dass ich reinterpret_cast verwende, ich bin mir nichtmal sicher, ob das in meinem Fall angebracht ist, vielleicht würden virtuelle Funktionen mehr bringen.

    Nunja, zu meinem Problem:

    Ich habe einen Container mit all meinen Objekten allObjects. Dieser Container ist vom Typ vector<Object>*. Da drinnen speichere ich aber auch MovingObject*, die von Object erben.

    Wenn ich nun versuche ein Attribut von MovingObject zu editieren, sagt mir mein Compiler, dass Object kein solchen Typ kennt, darum habe ich mir gedacht ich verwende reinterpret_cast:

    for (unsigned int i = 0; i < 2; i++)
                (reinterpret_cast<rO::MovingObject*> (allObjects[i]))->Speed = 5;
                (reinterpret_cast<rO::MovingObject*> (allObjects[i]))->SetMoveMode(D_UPDOWN); // Zeile 32
                (reinterpret_cast<rO::MovingObject*> (allObjects[i]))->SetChangeSideOnWindowLeave(true);
            }
    

    Leider spuckt mein Compiler mir tonnenweise Errors aus.
    Könntet Ihr mir vielleicht helfen? Ist es überhaupt klug hier reinterpret_cast zu verwenden?

    Errors:

    (32) : error C2065: 'i': nichtdeklarierter Bezeichner
    error C2227: Links von "->SetMoveMode" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.



  • Dein Problem: Die öffnende Klammer der Schleife fehlt.

    Desweiteren:
    1. dyn-Casten
    2. auf 0 prüfen (Cast erfolgreich oder nicht (0)?)
    3. nicht 0? dann verwenden



  • Wie schon erwähnt, suchst du den dynamic_cast. Aber an deiner Stelle würde ich den nicht benutzen. Es gibt viel schönere Lösungen.



  • Der zweite Fehler tritt IMMER auf, wenn er in der Zeile i nicht erkennt. So kann er das Array nicht auflösen.



  • Oh mein Gott!

    Verdammt. Danke für die Tipps! 😃



  • Michael E. schrieb:

    ... dynamic_cast. Aber an deiner Stelle würde ich den nicht benutzen. Es gibt viel schönere Lösungen.

    Ja, z.B. static_cast 😃



  • Oder aber gar kein Cast 🤡 (so wars gemeint).



  • Samyboy schrieb:

    [...] darum habe ich mir gedacht ich verwende reinterpret_cast:
    [...] Ist es überhaupt klug hier reinterpret_cast zu verwenden?

    Nein. Bei reinterpret_cast musst du ganz genau wissen, was du tust. Du hebelst nämlich das gesamte Typsystem aus, was sehr schnell mühsame Fehler erzeugen kann. Du brauchst diesen Cast wirklich nur auf Low-Level-Ebene, also im Allgemeinen sehr selten. Der C- und Funktionsstyle-Cast können übrigens auch Speicher reinterpretieren, nur ist das bei ihnen sehr unscheinbar (und daher auch eine gar nicht so offensichtliche Gefahrenquelle).



  • Nexus schrieb:

    Der C- und Funktionsstyle-Cast können übrigens auch Speicher reinterpretieren (...)

    Japp.
    Ganz besonders schlimm finde ich den Function Style Cast, da er wie ein Konstruktor aussieht.

    Beispiel:

    class Distance
    {
    public: 
        explicit Distance(char const* textualRepresentation);
        // ...
    };
    
    void foo(Distance d);
    
    void bar()
    {
        foo(Distance("one meter")); // OK, so lange Distance::Distance(char const*) das "one meter" verstehen kann
    }
    

    vs.

    typedef int Distance;
    
    void foo(Distance d);
    
    void bar()
    {
        foo(Distance("one meter")); // effektiv ein reinterpret_cast<int>() -> BUMM
    }
    

    Das Beispiel ist zugegebenermassen an den Haaren herbeigezogen. Allerdings hab' ich schon öfters Code gesehen, wo ein Function Style Cast "T(x)" verwendet wurde, wo nicht auf den ersten Blick klar war, ob T nun ein Class-Type ist oder nicht.


Anmelden zum Antworten