Von bstimmter Position aus einer Datei lesen.
-
3778436F7265 schrieb:
Ok also soweit ich das verstanden habe ist static_cast eine convertirung, wie bei deinem Bsp. wo du dann float und int miteinander verrechnen könntest.Ist das so richtig ?
Deine Rechtschreibung nicht, die Aussage: jain. Verrechnen?
Du kannst damit auch Basisklassenpointer zu Pointern von abgeleiteten Klassen machen. Oder enums zu ints konvertieren (afaik nicht bei der neuen C++11 Syntax: enum class {...}).
-
Hacker schrieb:
Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast
Dafür hat mir static_cast bisher fast immer gereicht.
Hacker schrieb:
const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.
const_cast ist für das hinzu- und wegcasten eines CV-Qualifiers. Also const/volatile.
-
314159265358979 schrieb:
const_cast ist für das hinzu- und wegcasten eines CV-Qualifiers.
...bei Zeigern und Referenzen.
-
Hacker schrieb:
Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast, und wenn du einen Zeiger konvertieren willst, reinterpret_cast. const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.
Das widerspricht sich ein bißchen, da die Fälle sich ja überlappen.
-
Hacker schrieb:
und wenn du einen Zeiger konvertieren willst,
dann machst du was falsch.
-
Ja, damit man Basisklassen- zu Kindklassenpointern mit dynamic_cast konvertieren kann, muss die Basisklasse natürlich mindestens eine Virtuelle Methode haben.
@krümelkacker & otze:
reinterpret_cast ist nützlich, wenn Etwas bitweise interpretiert werden soll. So etwas zum Beispiel ist nur mit diesem Cast-Operator möglich:
int b; long speicherwert(reinterpret_cast<long>(&b));Und was zu dynamic_cast und static_cast beachten ist: dynamic_cast prüft vor der Konvertierung, ob der Zieltyp des Basisklassenzeigers auch der ist, auf den dieser Zeigt. Sonst wird ein Null-zeiger zurückgegeben. Das ist sinnvoll, da es sicherer ist (da Klasse B anders als C ist, wie man sich denken kann).
#include <iostream> struct A{ virtual ~A(){} }; // durch den virtuellen Destruktor polymorph struct B: public A{}; // von A abgeleitet struct C: public A{}; // von A abgeleitet int main() { A* c(new C); std::cout << dynamic_cast<B*>(c) << '\n';//0 std::cout << static_cast<B*>(c) << '\n';//0x... }Dieses Programm würde ich lieber nicht ausführen:
#include <iostream> struct A { virtual ~A(){} // durch den virtuellen Destruktor polymorph }; struct B: public A { std::string h; int b; }; struct C: public A { int c; }; int main() { A* c(new C); B* gefaehrlich(static_cast<B*>(c)); gefaehrlich->b = 0; std::cout << gefaehrlich->h << '\n'; }Mit dynamic_cast wäre das nicht passiert. Abgestürzt wär's wahrscheinlich trotzdem, aber man kann auf Null-Rückgabe prüfen.
-
Hacker schrieb:
reinterpret_cast ist nützlich, wenn Etwas bitweise interpretiert werden soll. So etwas zum Beispiel ist nur mit diesem Cast-Operator möglich:
int b; long speicherwert(reinterpret_cast<long>(&b));Das ist nun das mit Abstand schlechteste Beispiel, das du bringen konntest. Die Addresse interessiert nun wirklich keine Sau. Du hättest z.B. zeigen können, wie man Werte binär in einen Stream schreibt.
Hacker schrieb:
Das ist sinnvoll, da es sicherer ist.
So 'n Quatsch. Das sind zwei verschiedene Dinge.
Hacker schrieb:
Mit dynamic_cast wäre das nicht passiert. Abgestürzt wär's wahrscheinlich trotzdem, aber man kann auf Null-Rückgabe prüfen.
Nenn doch deine Klassen z.B. Base, Derived1 und Derived2, dann tut man sich beim lesen des Codes leichter.
-
314159265358979 schrieb:
Hacker schrieb:
reinterpret_cast ist nützlich, wenn Etwas bitweise interpretiert werden soll. So etwas zum Beispiel ist nur mit diesem Cast-Operator möglich:
int b; long speicherwert(reinterpret_cast<long>(&b));Das ist nun das mit Abstand schlechteste Beispiel, das du bringen konntest. Die Addresse interessiert nun wirklich keine Sau.
Findest du, weil du eine Sau bist. Einen Menschen interessierts

PI schrieb:
Hacker schrieb:
Das ist sinnvoll, da es sicherer ist.
So 'n Quatsch. Das sind zwei verschiedene Dinge.
Das widerspricht sich nicht einmal, und außerdem: Zeig mir in diesem Zusammenhang mal, wie static_cast besser/gleich gut funktioniert, als dynamic_cast
Hacker schrieb:
Mit dynamic_cast wäre das nicht passiert. Abgestürzt wär's wahrscheinlich trotzdem, aber man kann auf Null-Rückgabe prüfen.
Nenn doch deine Klassen z.B. Base, Derived1 und Derived2, dann tut man sich beim lesen des Codes leichter.[/quote]
Lesen wird (da!) groß Geschrieben.
Und außerdem hat das damit nichts zu tun. Es geht darum, dass man bei dynamic_cast prüfen kann, ob der Cast funktioniert hat, bzw. "nicht noch ins Verderben führen wird" (wie soll ich dass denn ausdrücken
).
-
Hacker schrieb:
Findest du, weil du eine Sau bist. Einen Menschen interessierts

Du weißt nicht, wann Schluss ist, kleiner Mann.
Hacker schrieb:
Das widerspricht sich nicht einmal
Was widerspricht sich nicht?
Hacker schrieb:
Zeig mir in diesem Zusammenhang mal, wie static_cast besser/gleich gut funktioniert, als dynamic_cast
Ich hab doch schon gesagt, dass das zwei verschiedene Dinge sind. Was willst du von mir?
Hacker schrieb:
Lesen wird (da!) groß Geschrieben.
Fang mal nicht mit Rehctshcriebfalems an, du kannst nur verlieren.
Hacker schrieb:
Und außerdem hat das damit nichts zu tun. Es geht darum, dass man bei dynamic_cast prüfen kann, ob der Cast funktioniert hat, bzw. "nicht noch ins Verderben führen wird" (wie soll ich dass denn ausdrücken
).Ich sags dir auch gerne ein drittes mal: Das sind zwei verschiedene Dinge.
-
Moment mal. Thorsten Dörnbach?
314159265358979 schrieb:
Hacker schrieb:
Das ist sinnvoll, da es sicherer ist.
So 'n Quatsch. Das sind zwei verschiedene Dinge.
Also,
314159265358979 schrieb:
Hacker schrieb:
Das widerspricht sich nicht einmal
Was widerspricht sich nicht?
Das es zwei verschiedene Dinge sind, und dass das eine sicherer ist, wenn es um etwas konkretes geht (!). Haste wohl missverstanden.
Und was sind zwei verschiedene Dinge? Ich hoffe, dynamic_cast und static_cast?
-
Hacker schrieb:
Moment mal. Thorsten Dörnbach?
wat?
Hacker schrieb:
Und was sind zwei verschiedene Dinge? Ich hoffe, dynamic_cast und static_cast?
Rüchtüch. Und deswegen ist das eine auch nicht sicherer, als das andere. Es sind zwei verschiedene Dinge.
-
314159265358979 schrieb:
Und deswegen ist das eine auch nicht sicherer, als das andere. Es sind zwei verschiedene Dinge.
Ich meinte es nicht so allgemein wie du denkst. Es bezog sich auf's konvertieren von Basisklassen- zu Kindzeigern.
Zu Thorsten Dörnbach: hier ist ein lustiges Video.
Du erinnerst mich (aus fraglichem Grund) an den.
-
Hacker schrieb:
Ich meinte es nicht so allgemein wie du denkst. Es bezog sich auf's konvertieren von Basisklassen- zu Kindzeigern.
Äh, wat? Wofür willst du dynamic_cast denn dann verwenden, wenn nicht dafür? Davon reden wir doch die ganze Zeit.
Hacker schrieb:
Zu Thorsten Dörnbach: hier ist ein lustiges Video.
Du erinnerst mich (aus fraglichem Grund) an den.Mein Internet ist grad zu langsam dafür. :p
-
314159265358979 schrieb:
Hacker schrieb:
Ich meinte es nicht so allgemein wie du denkst. Es bezog sich auf's konvertieren von Basisklassen- zu Kindzeigern.
Äh, wat? Wofür willst du dynamic_cast denn dann verwenden, wenn nicht dafür? Davon reden wir doch die ganze Zeit.
Ja eben! Ich meinte, da ist dynamic_cast sicherer.
-
Und genau das ist Schwachsinn.
-
314159265358979 schrieb:
Und genau das ist Schwachsinn.
Weil es zwei verschiedene Sachen sind? Was ist das für eine Logik?

-
Nochmal anders: Selbst, wenn static_cast und dynamic_cast beide nur diese Casts könnten, so wären es immer noch zwei verschiedene Dinge und deine Aussage immer noch Schwachsinn. Jetzt verständlicher?
-
314159265358979 schrieb:
Nochmal anders: Selbst, wenn static_cast und dynamic_cast beide nur diese Casts könnten, so wären es immer noch zwei verschiedene Dinge und deine Aussage immer noch Schwachsinn. Jetzt verständlicher?
Und was ist das Problem, wenn sie verschieden sind? Werd' mal konkret.
Edit: Gibst du dich geschlagen?
-
Hacker schrieb:
Und was ist das Problem, wenn sie verschieden sind?
Bis auf die Tatsache, dass das nicht verstanden hast, nichts.
Hacker schrieb:
Edit: Gibst du dich geschlagen?
What. Wie kommstn darauf?
-
Hacker schrieb:
Ja eben! Ich meinte, da ist dynamic_cast sicherer.
Und jetzt erkläre ich dir mal, warum das falsch ist. Wir sind uns schonmal in 2 Dingen einig:
1. nur dynamic_cast kann cross-casts, weswegen es etwas völlig anderes ist als static_cast
2. sowohl static_cast als auch dynamic_casts können down-casts machenWo liegt jetzt der Unterschied in 2? static_cast kann nicht überprüfen, ob der Zeiger wirklich vom Kindtyp ist. Er castet einfach.
"Also ist dynamic _cast doch viel sicherer, oder?"
Nein, denn static_cast funktioniert immer, sobald man weiß, dass die Typen stimmen. Also ist static_cast absolut sicher. Hier kommt wieder zum tragen, dass dynamic_cast etwas völlig anderes ist: er funktioniert in diesem Szenario genau dann, wenn static_cast funktioniert, kann aber auch dann eingesetzt werden, wenn der Zieltyp nicht 100% bekannt ist, man also raten muss. Diese Funktionalität hat also einen völlig anderen Anwendungsbereich als static_cast.//edit hmm beim reinterpret_cast mit zeigern hattest du recht. Ohne kriegt man es nur unter bestimmten alignment betrachtungen hin...