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.

15.2 Unions im OO Kontext 469<br />

durch die entsprechenden Typumwandlungs-Operatoren <strong>in</strong> den Zeilen 95–110<br />

ersetzt.<br />

Die Implementationen des Copy Constructors und des Zuweisungsoperators<br />

bergen ke<strong>in</strong>e Neuigkeiten, also sehen wir uns nur noch kurz die Verwendung<br />

unserer gekapselten Union an:<br />

• In Zeile 161 wird setValue mit e<strong>in</strong>em u<strong>in</strong>t32 Parameter aufgerufen. Der<br />

explizite Cast ist notwendig, da ja 10 e<strong>in</strong>fach als <strong>in</strong>t <strong>in</strong>terpretiert wird und<br />

somit der Compiler vor e<strong>in</strong>em Ambiguitätsproblem stehen würde.<br />

• In den Zeilen 165–166 wird korrekt auf die Union zugegriffen und dementsprechend<br />

funktioniert alles wie geplant.<br />

• In den Zeilen 167–168 jedoch wird versucht e<strong>in</strong>en double Wert zu lesen,<br />

der hier ungültig ist. Zum Glück gibt’s das try ... catch Konstrukt :-).<br />

Anzumerken wäre hier noch, dass Fehlermeldungen wie <strong>in</strong> den Zeilen 174<br />

und 189 im Normalfall immer auf cerr und nicht auf cout geschrieben<br />

werden müssen. Im Demoprogramm wurde nur deshalb auf cout geschrieben,<br />

um die Reihenfolge der e<strong>in</strong>zelnen Ausgaben nicht durche<strong>in</strong>ander zu<br />

br<strong>in</strong>gen.<br />

• In den Zeilen 177–190 f<strong>in</strong>det dasselbe Spielchen noch e<strong>in</strong>mal statt, nur eben<br />

hier mit e<strong>in</strong>em double Wert.<br />

Dass me<strong>in</strong>e Beschreibung der Vorgänge nicht frei erfunden ist, sieht man am<br />

folgenden Output, den das Programm liefert:<br />

DummyUnion constructor<br />

t r y i n g u<strong>in</strong>t32 value : 1 0<br />

t r y i n g double value : oops − t r i e d to a c c e s s wrong type . . .<br />

t r y i n g double value : 2 0 . 5<br />

t r y i n g u<strong>in</strong>t32 value : oops − t r i e d to a c c e s s wrong type . . .<br />

DummyUnion d e s t r u c t o r<br />

Obwohl wir hier also offensichtlich e<strong>in</strong>en Weg gefunden haben, Unions e<strong>in</strong>igermaßen<br />

sicher zu machen, sollte man sich e<strong>in</strong>ige Gedanken um deren<br />

Verwendung bzw. um die Vermeidung derselben machen:<br />

Wenn wir hier e<strong>in</strong>mal ganz bestimmte und besondere Vorgaben durch die<br />

Hardware oder durch Fremdsysteme außen vor lassen, ist der e<strong>in</strong>zige Grund<br />

für die Verwendung von Unions die damit erreichbare Speicherersparnis.<br />

Überlegt man allerd<strong>in</strong>gs, dass der von e<strong>in</strong>er Union benötigte Speicher<br />

immer ihrem größten Member entspricht, dann kommt man zu folgendem<br />

Schluss: Sollten alle Members e<strong>in</strong>igermaßen gleich groß se<strong>in</strong>, dann erreicht<br />

man e<strong>in</strong>e s<strong>in</strong>nvolle Ersparnis. Sollte es jedoch zum<strong>in</strong>dest e<strong>in</strong>en Member geben,<br />

der im Vergleich zu den anderen sehr groß ist, dann ist die Ersparnis<br />

nicht mehr wirklich gegeben. Ganz im Gegenteil! Man kann hierbei nämlich<br />

je nach Anwendung sogar e<strong>in</strong>e große Speicherverschwendung bewirken, denn<br />

auch für die kle<strong>in</strong>en Members wird immer der Platz des bzw. der großen<br />

belegt!<br />

Aus dieser Überlegung heraus kommt man schnell zu dem Schluss, dass es<br />

<strong>in</strong> solchen Fällen besser wäre, mit e<strong>in</strong>er vernünftigen Klassenhierarchie und<br />

unter s<strong>in</strong>nvoller Ausnützung der Polymorphismus-Eigenschaften zu arbeiten.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!