ich würde mich gerne auf die c++ casts beschränken (soweit ich mitbekommen habe sind C-casts nicht mehr empfehlenswert)
Grundlegend spricht nichts gegen C-Casts. Der "Vorteil" von C++ Casts ist eben das jeder Casting-Operator genau
eine Aufgabe erledigt, ein C-Cast umfasst alle diese Aufgaben. Der Vorteil ist eben das man bei C++ Casts genau sieht
was der Cast macht. Außerdem sind C++ Casts-Operator aufgrund ihres Aussehens sehr auffällig im Code. Man sieht also ganz leicht
wo, was gecastet wird.
Außerdem werden z.T. diverse Dinge angeboten wie z.B. Ausnahmen die beim fehlerhaften Umwandeln geworfen werden.
ich verstehe nicht wann, was, wie gecastet werden kann/darf.
Eigentlich sollte man versuchen immer ohne Typenumwandlung auszukommen. Casts untergraben das strikte Typensystem von C++ und sind deshalb nicht empfehlenswert. Allerdings gibt es doch hin und wieder Situationen bei denen Casts eine elegantere Lösung darstellen, in diesen (seltenen) Situationen sind Casts also erlaubt.
ich verstehe auch die unterschiede nicht zwischen dynamic, reinterpret bzw. const_cast usw.
static_cast
Wird zum Casten von Typen in andere Typen verwendet die implizit zueinander gecastet werden können
und erlaubt das zurückcasten der Typen, selbst wenn das implizit nicht erlaubt ist.
Wenn static_cast auf Zeiger angewendet wird, ist es möglich ein Objekt eines spezialisierten Typs eines Basistyps (z.B. Derived : public Base) zu einem Zeiger des Basistyps (implizit), als auch, umgekehrt, ein Zeiger vom Basistyp in einen Zeiger des abgeleiteten Typs umzuwandeln.
Merke:
Wandelt Typen um die implizit zueinander gecastet werden können
Kann umgekehrt (im 1. Punkt genannte Typen) zurück casten
Wandelt Zeiger auf abgeleitete Typen in Zeiger auf Basistypen um
Kann umgekehrt Zeiger auf Basistypen in Zeiger auf Abgeleitete Typen umwandeln
Prüft nicht nach ob die gültig ist (z.B. ob das Objekt ein vollständiges Objekt des Umwandlungstyps ist).
dynamic_cast
Wird zum Casten von Zeigern und Referenzen auf Objekten polymorpher Typen verwendet. Hier wird geprüft ob ein Cast gültig ist. Im Fehlerfall wird eine Ausnahme geworfen. Dieser Casting-Operator
kann sehr Performancefressend sein!
Merke:
Zum Umwandeln von Zeigern und Referenzen auf Polymorphe Typen verwendet
Prüft ob die Umwandlung "gültig" ist und wirft Ausnahme im Fehlerfall
reinterpret_cast
Der C-Cast ähnlichste Cast-Operator von C++. Er erlaubt jeden Zeigertyp in einen beliebigen anderen Zeigertyp zu casten. Kann Zeiger auf Objekte unabhängiger Klassen casten.
Merke:
Umwandeln von jeden Zeigertyp auf jeden anderen Zeigertyp möglich
Umwandeln von Zeigern, zu Zeigern auf unabhängige Objekte möglich
Führt eine einfache binäre Kopie beim Umwandeln durch
Keine Prüfung ob die Umwandlung gültig ist
Nicht portabel.
const_cast
Manipuliert das
const-Attribut des übergebenen Objekts. Ein Objekt kann also übergeben werden und in ein nicht konstantes Objekt gleichen Typs umgewandelt werden.
Merke:
Manipuliert das const-Attribut des übergebenen Objekts
Der einzige Cast-Operator der die "Konstantheit" von Objekten beeinflussen kann
Kann auch den volatile Vermerk von Objekten ändern
ich steh ja schon an wenn ich einen system::string zu char convertieren soll..
Da werden, wie bereits erwähnt, oftmals Methoden angeboten.
edit:
wenn ich schon da bin.. ich hab so nen kleinen "chat" geschrieben.. also mithilfe eins tutorials natürlich
und jetzt versuche ich das ganze auf visual c anzuwenden, jedoch .. beim senden verwende ich die funktion
|
C-/C++-Quelltext
|
1
|
send(SOCKET s, const char *buf, int len, int flags);
|
und naja.. wie ihr sehn könnt ist der 2te parameter ein const char, der text aus der textbox den ich gerne senden würde ist jedoch vom typ system::string und damit hab ich wie gesagt so meine probleme
Vermutlich so:
|
C-/C++-Quelltext
|
1
2
3
|
const char* buf = ( const char* )( void* )Marshal::StringToHGlobalAnsi( str );
send( s, buf, len, flags );
Marshal::FreeHGlobal( buf );
|