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.

2.4 Zusammengesetzte Datentypen 41<br />

undef<strong>in</strong>ierte Werte. Woher sollte auch bei e<strong>in</strong>em Keyboard Event e<strong>in</strong>e Koord<strong>in</strong>ate<br />

kommen? Der Computer weiß ja doch nicht, wo am Schreibtisch<br />

nun das Keyboard steht und ob das l<strong>in</strong>ke obere oder das l<strong>in</strong>ke untere Eck des<br />

Schreibtischs die Nullposition markiert :-).<br />

Was also benötigt wird, ist die Möglichkeit, sogenannte Varianten zu<br />

implementieren. In unserem Fall der Events würde e<strong>in</strong>e solche Variante bei<br />

e<strong>in</strong>em Keyboard-Event nur die Daten besitzen, die für das Keyboard-Handl<strong>in</strong>g<br />

<strong>in</strong>teressant s<strong>in</strong>d, bei e<strong>in</strong>em Mouse-Event nur die, die für das Mouse-Handl<strong>in</strong>g<br />

<strong>in</strong>teressant s<strong>in</strong>d, etc.<br />

Wie auch C stellt uns C ++ e<strong>in</strong> solches Konstrukt zur Verfügung: die<br />

union. Auch hier muss ich, wie schon bei den Structures, vorausschicken,<br />

dass Unions <strong>in</strong> C ++ durch die Objektorientierung der Sprache umfassender<br />

def<strong>in</strong>iert s<strong>in</strong>d, als <strong>in</strong> C. Auf die Besonderheiten, die sich daraus ergeben,<br />

komme ich Abschnitt 15.2 zu sprechen.<br />

Bleiben wir hier aber im Augenblick beim Wesentlichen. Per Def<strong>in</strong>ition<br />

lässt sich e<strong>in</strong>e union folgendermaßen charakterisieren:<br />

E<strong>in</strong>e union entspricht e<strong>in</strong>er struct mit dem essentiellen Unterschied,<br />

dass sich die Members denselben Speicherplatz teilen! Dadurch wird<br />

Folgendes impliziert:<br />

• Der Speicherbedarf e<strong>in</strong>er union ist immer genau so hoch, wie der Speicherbedarf<br />

für den größten dar<strong>in</strong> enthaltenen Member. Dies kommt genau daher,<br />

dass ja Members <strong>in</strong> e<strong>in</strong>er union nur alternativ Gültigkeit besitzen<br />

(anstatt gleichzeitig, wie bei e<strong>in</strong>er struct).<br />

• Gerade erwähnt, aber weil es so wichtig ist, noch e<strong>in</strong>mal: Es besitzt zu<br />

e<strong>in</strong>em gewissen Zeitpunkt immer nur e<strong>in</strong> e<strong>in</strong>ziger Member Gültigkeit!<br />

Die restlichen Members enthalten ke<strong>in</strong>e s<strong>in</strong>nvollen Werte.<br />

• Die Deklaration e<strong>in</strong>er union erfolgt äquivalent zur Deklaration e<strong>in</strong>er struct,<br />

nur wird statt des Keywords struct das Keyword union verwendet.<br />

• Der Zugriff auf Members e<strong>in</strong>er union erfolgt analog zum Zugriff auf Members<br />

e<strong>in</strong>er struct. Es wird ebenfalls e<strong>in</strong>em Variablennamen e<strong>in</strong> Punkt<br />

gefolgt vom Namen des gewünschten Members nachgestellt.<br />

• Es gibt ke<strong>in</strong>e von der Sprache direkt unterstützte Möglichkeit, zur Laufzeit<br />

herauszuf<strong>in</strong>den, welcher der Members e<strong>in</strong>er union gerade Gültigkeit<br />

besitzt!<br />

Vorsicht Falle: Wie schon erwähnt, stellt C ++ ke<strong>in</strong>e direkte Möglichkeit<br />

zur Verfügung, mittels der man den zu e<strong>in</strong>em bestimmten Zeitpunkt gültigen<br />

Member e<strong>in</strong>er union herausf<strong>in</strong>den kann. Genau dieser Umstand macht e<strong>in</strong>e<br />

union zu e<strong>in</strong>em potentiellen Kandidaten für Softwarefehler. In Programmen<br />

f<strong>in</strong>den sich leider immer wieder die abstrusesten Konstrukte, die entweder<br />

davon ausgehen, dass “jetzt sowieso nur dieser Member gültig se<strong>in</strong> kann”<br />

oder <strong>in</strong> denen sonstige wilde Annahmen und Schätzungen stattf<strong>in</strong>den.<br />

Vor solchen Vorgehensweisen möchte ich unbed<strong>in</strong>gt abraten, denn diese<br />

führen unweigerlich früher oder später durch Fehlzugriffe zu den unglaub-

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!