30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

9.4 Weitere wichtige technische Aspekte 247<br />

static_cast: Dieser Cast überprüft zur Compilezeit, ob e<strong>in</strong>e Umwandlung<br />

zu e<strong>in</strong>em gewünschten Typ theoretisch möglich se<strong>in</strong> könnte.<br />

Wenn ja, wird der entsprechende Code e<strong>in</strong>gesetzt. Die Anwendung des<br />

Casts alle<strong>in</strong> führt zur Laufzeit noch zu ke<strong>in</strong>em Fehler. Erst falscher Zugriff<br />

auf Members (Variablen oder Methoden) e<strong>in</strong>es illegal gewandelten<br />

Typs führen dann direkt zu e<strong>in</strong>er Segmentation Violation.<br />

re<strong>in</strong>terpret_cast: Dieser Cast nimmt überhaupt ke<strong>in</strong>e Überprüfung<br />

vor, ob e<strong>in</strong>e Umwandlung überhaupt möglich se<strong>in</strong> könnte. Entsprechende<br />

Fehl<strong>in</strong>terpretationen fallen zur Compilezeit sicherlich nicht auf und zur<br />

Laufzeit machen sie sich <strong>in</strong> gewohnter Manier durch e<strong>in</strong>e Segmentation<br />

Violation bemerkbar.<br />

Genau <strong>in</strong> diesem Verhalten der Cast-Operatoren ist bed<strong>in</strong>gt, dass ich zuerst<br />

die starke Empfehlung gegeben habe, bei Downcasts <strong>in</strong> jedem Fall e<strong>in</strong>en<br />

dynamic_cast zu verwenden. Sollte es hier zum Problem kommen, dann<br />

passiert der Fehler genau dort, wo die Umwandlung stattf<strong>in</strong>det. Würde man<br />

stattdessen e<strong>in</strong>en static_cast nehmen, dann überprüft der Compiler kurz<br />

die Ableitungshierarchie auf entsprechende Möglichkeiten. Sollte die Wandlung<br />

theoretisch möglich se<strong>in</strong>, so wird der entsprechende Code e<strong>in</strong>gesetzt. Zur<br />

Laufzeit allerd<strong>in</strong>gs wird beim Umwandeln ke<strong>in</strong>e Überprüfung mehr vorgenommen<br />

und das Programm fällt dann unmotiviert bei irgende<strong>in</strong>er sche<strong>in</strong>bar<br />

korrekten Anweisung auf die Nase. Das bedeutet also, dass man bei e<strong>in</strong>em<br />

fehlgeschlagenen dynamic_cast Ursache und Auswirkung mite<strong>in</strong>ander gekoppelt<br />

hat und solche Fehler daher leicht f<strong>in</strong>det. Bei e<strong>in</strong>em static_cast s<strong>in</strong>d<br />

Ursache und Auswirkung entkoppelt und die Fehlersuche wird zum nächtlichen<br />

Vergnügen.<br />

9.4.5 Friends von Klassen<br />

Manchmal (wirklich nur manchmal!!!) gibt es Fälle, <strong>in</strong> denen trotz e<strong>in</strong>es<br />

sauberen Designs die <strong>in</strong> C ++ verfügbaren Access-Specifiers nicht ausreichen,<br />

um e<strong>in</strong>e vernünftige Kapselung des Zugriffs vorzunehmen. Solche Fälle treten<br />

dann auf, wenn z.B. e<strong>in</strong>e besondere Funktion (nicht Methode!) oder<br />

alle Methoden e<strong>in</strong>er bestimmten Klasse Zugriff auf Interna e<strong>in</strong>er bestimmten<br />

Klasse erhalten sollen. Mittels public würde man den Zugriff für alle Außenstehenden<br />

freigeben, das will man nicht. Man will den Zugriff nur ganz<br />

gezielt erlauben. Hierzu gibt es <strong>in</strong> C ++ die sogenannten friend Deklarationen.<br />

Wie der Name schon sagt, erklärt man damit bestimmte Außenstehende<br />

zu freundlich Ges<strong>in</strong>nten, die schon nichts Böses anrichten werden und denen<br />

deshalb der Zugriff auch auf die privatesten Bereiche gestattet wird.<br />

Vorsicht Falle: Dass man mit der Annahme der freundlichen Ges<strong>in</strong>nung<br />

vorsichtig se<strong>in</strong> muss, versteht sich von selbst. Es gibt <strong>in</strong> der <strong>Softwareentwicklung</strong>,<br />

so wie auch im realen Leben, auch immer wieder falsche Freunde.<br />

Nichts lässt bei Entwicklern mehr Freude aufkommen, als wenn sie Fehler

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!