30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

3.6 Datentypabfragen und explizite Typecasts 69<br />

man, dass -1 <strong>in</strong>terpretiert als unsigned nicht wirklich so toll ist! Und hier<br />

kann auch der beste Compiler nichts machen, denn wie schon erwähnt, wird<br />

der Code zur Umwandlung zur Compiletime e<strong>in</strong>gesetzt. Zu dieser Zeit ist<br />

allerd<strong>in</strong>gs im Normalfall nicht bekannt, dass vielleicht später zur Laufzeit<br />

e<strong>in</strong> negativer Wert <strong>in</strong> e<strong>in</strong>en unsigned Wert verwandelt werden soll.<br />

Vorsicht Falle: Auch e<strong>in</strong> static_cast bewahrt nicht vor den schweren Fehlern,<br />

die beim Mischen von signed und unsigned Typen passieren können,<br />

denn zur Compiletime, zu der der entsprechende Umwandlungscode e<strong>in</strong>gesetzt<br />

wird, ist der umzuwandelnde Wert ja noch nicht überprüfbar! Aus<br />

diesem Grund muss ich zum wiederholten Mal darauf h<strong>in</strong>weisen, dass unvorsichtiges<br />

Mischen von Datentypen katastrophale Folgen haben kann und<br />

tunlichst unterlassen werden soll!<br />

3.6.4 Runtime-checked Cast<br />

Es gibt beim Arbeiten mit Klassen und Objekten <strong>in</strong> C ++ Fälle, die wir im OO-<br />

Teil noch kennen lernen werden, bei denen der Compiler bei der Übersetzung<br />

des Programms nicht wissen kann, mit welchem Typ man es zur Laufzeit <strong>in</strong><br />

e<strong>in</strong>em Ausdruck zu tun haben wird. In diesem Fall ist e<strong>in</strong> static_cast nicht<br />

verwendbar, da für e<strong>in</strong>en static_cast vom Compiler Code e<strong>in</strong>gesetzt wird,<br />

der die tatsächliche Umwandlung vornimmt. Wenn aber der Typ zu dieser<br />

Zeit noch unbekannt ist, welchen Code soll der Compiler dann e<strong>in</strong>setzen?<br />

Der Fall, dass man erst zur Laufzeit entscheiden kann, welchen Typ e<strong>in</strong><br />

Objekt nun wirklich hat, kommt <strong>in</strong> der OO-Programmierung relativ oft vor,<br />

also darf man nicht verh<strong>in</strong>dern, dass e<strong>in</strong>e eventuell zur Laufzeit korrekte<br />

Umwandlung bereits im Vorfeld vom Compiler abgelehnt wird, bloß weil er<br />

nicht feststellen kann, ob hier später korrekt oder <strong>in</strong>korrekt umgewandelt<br />

würde und welchen Code er e<strong>in</strong>setzen soll. Damit würde man die Flexibilität<br />

von C ++ stark e<strong>in</strong>schränken. Schlimmer noch, man würde sogar saubere<br />

Programmierung zugunsten von brute-force Ansätzen verh<strong>in</strong>dern!<br />

Aus diesem Grund wurde <strong>in</strong> C ++ der dynamic_cast e<strong>in</strong>geführt. Dieser<br />

sagt dem Compiler, dass er Code e<strong>in</strong>setzen soll, der erst zur Laufzeit entscheidet,<br />

ob e<strong>in</strong>e Umwandlung nun zulässig ist oder nicht. Sollte sie zur Laufzeit<br />

als zulässig erkannt werden, so wird sie entsprechend durchgeführt, wenn<br />

nicht, wird zur Laufzeit e<strong>in</strong> Fehler generiert. Die Syntax und Semantik e<strong>in</strong>es<br />

Aufrufs von dynamic_cast s<strong>in</strong>d dieselbe wie wir sie schon von static_cast<br />

kennen.<br />

Leser, die nun hoffen, dass e<strong>in</strong> dynamic_cast vor den schweren Fehlern<br />

bewahren würde, die man beim Mischen von signed und unsigned Typen<br />

machen kann, die muss ich leider enttäuschen. Der dynamic_cast kümmert<br />

sich nur um D<strong>in</strong>ge, die bei Klassenhierarchien bei der OO-Programmierung<br />

<strong>in</strong>teressant s<strong>in</strong>d und zu denen wir noch kommen werden. Er ist leider auf

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!