dynamic_cast<>()



  • Hallo!

    Ich habe ein Problem mit dynamischen Casts bei einer polymorphen Klasse.

    Product* pv[100]; // Basisklasse
    // ................
    dynamic_cast<UnpackedFood*>(pv[x])->getPreis(); //down-cast in die abgeleiteten klasse
    

    Der Compiler meldet mir bei dieser Konstruktion:
    [msdn]
    C:\code\C++\ch25.2.cpp(52) : warning C4541: 'dynamic_cast' fuer polymorphen Typ 'class Product' mit /GR- verwendet; unvorhersehbares Verhalten moeglich.[/msdn]

    Und genau das passiert auch. Das Programm verabschiedet sich vor dem letzten Befehl vor dieser Konstruktion.

    Aber genau fuer solche Situationen wurde der dynamische Cast doch geschaffen.

    thx in advance

    Raptor



  • Ja, musst du in der IDE bzw. beim Compiler einschalten.



  • Warum machst du erst einen C-Style Cast und dann noch einen dynamic_cast zum selben Typ? Bin mir nicht ganz sicher, ob das negative Auswirkungen hat, auf jeden Fall ist es überflüssig. Ja und RTTI musst du natürlich beim Compiler aktivieren, falls er das nicht von vornherein kann.



  • Ups... entschuldigung.
    Das war so nicht gewollt.
    Das mit dem doppelten cast ist naetuerlich bloedsinn.
    hab das nur mal testweise versucht.

    jetzt stimmt es wieder

    Product* pv[100]; // Basisklasse
    // ................
    dynamic_cast<UnpackedFood*>(pv[x])->getPreis(); //down-cast in die abgeleiteten klasse
    


  • Der Code hat noch eine fragwürdige Stelle. Der einzige Zusatznutzen von dynamic_cast gegenüber static_cast ist, dass dynamic_cast überprüft, ob der Cast zulässig ist (d.h. ob dein Product* wirklich auf ein UnpackedFood-Objekt zeigt). Bei einem Fehler gibt er einen Nullpointer zurück, bzw. wirft im Fall von Referenzen statt Pointern die Exception std::bad_cast aus. Dein Code geht aber unbesehen davon aus, dass der Cast erfolgreich verläuft. Falls das gewollt ist, kannst du auch gleich static_cast verwenden.



  • Zum Casten habe ich zwei andere einfache Fragen:
    1. Kann man weiterhin den alten cast verwenden, z. B. f = float(i), oder sollte man nur noch den neuen verwenden: f = static_cast<float>(i)?
    2. Bezeichnet man die Umwandlung von float nach int und von int nach float als cast, oder nur die Umwandlung von int nach float?



  • zu 1:
    man sollte den neuen verwenden. sprich:

    <name>_cast<T>(Ausdruck)
    

    die "neuen" casts in c++, static_cast, dynamic_cast, const_cast und reinterpret_cast, unterscheiden zum einen nach der art der umwandlung (siehe dazu faq) und sind zum anderen im quelltext gut zu erkennen, anders die c casts, die oft "verschwinden" beim lesen von code.

    zu 2:
    man nennt implizite typumwandlung nur implizite typumwandlung. der begriff "cast" findet sich meines wissens nur bei der expliten typumwandlung, also wenn der programmierer/die programmiererin die umwandlung selber in die hand nimmt.



  • Also würde man in beiden Fällen von einem Cast sprechen, wenn ich das Umwandeln selbst vornehme.
    Danke.



  • ingoingo schrieb:

    1. Kann man weiterhin den alten cast verwenden, z. B. f = float(i), oder sollte man nur noch den neuen verwenden: f = static_cast<float>(i)?

    Hier ist kein "alter cast" anwesend.



  • Es würde mir mehr helfen, wenn du sagen würdest, warum nicht.



  • Ein cast geht so:

    (int)
    

    Was du anwendest, ist ein operator.



  • definiere 'operator' 🙄



  • Du weisst nicht, was ein Operator ist?? *staun* 😉

    class Integer
    {
    public:
    	Integer()
    	{
    		x = 5;
    	}
    
    	operator int()
    	{
    		return x;
    	}
    
    private:
    	int x;
    };
    
    int main()
    {
    	Integer a;
    	int x = 17 + int(a);     // operator int()
    
    	cout  <<  x  <<  "\n";   // gibt 22 aus.
    }
    


  • Integer a;
    
    cout  <<  (int)a  <<  "\n";   // gibt 5 aus.
    cout  <<  int(a)  <<  "\n";   // gibt 5 aus.
    cout  <<  a  <<  "\n";   // gibt 5 aus.
    cout  <<  static_cast<int>(a)  <<  "\n";   // gibt 5 aus.
    

    und jetzt?

    int i = 42;
    double d = double(i); //etwa int::operator double?
    

    hört sich mehr nach function-style cast an.

    mehr info unter 5.2.3



  • Ein function-style-Cast ist ein Konstruktoraufruf, kein Cast-Operator. Daraus folgt, dass ein Cast nicht unbedingt ein Operator sein muss. (Wenn man schon Haare spalten will, dann richtig. Darum scheint es ja in diesem Thread wenigstens partiell zu gehen.)

    Hume: Der function-style-Cast ist nicht wesentlich älter als foobar_cast<>()? *staun*



  • Prima, wie ihr hier helft. Jetzt ist alles klar.



  • [schmarrn]



  • @Bashar
    Ich kenne den Ausdruck "alter Cast" nur als Synonym für "C-style" Cast. Der function-style cast, als reiner C++ Cast, zählt insofern nicht dazu. Wenn du allerdings einschlägige Quellen kennst, die "alter Cast" in diesem Zusammenhang anders definieren, habe ich auch kein Problem damit meine Aussage zurück zunehmen.



  • Ich kenne den Begriff "alter Cast" nur als Gegensatz zu den "neuen" Cast-Operatoren. Da das kein Fachbegriff ist, tu ich mich allerdings ein bisschen schwer mit Quellen 😉



  • Was ist ein function-style Cast?



  • int i = int(x)

    double d = double(x)


Anmelden zum Antworten