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.

354 12. Operator Overload<strong>in</strong>g<br />

MathVector , id = 0 : standard constructor<br />

MathVector , id = 0 : operator ∗<br />

MathVector , id = 1 : copy constructor , other id = 0<br />

MathVector , id = 1 : d e s t r u c t o r<br />

MathVector , id = 0 : d e s t r u c t o r<br />

Das Makefile zu diesem Meisterwerk f<strong>in</strong>det man erwartungsgemäß auf der<br />

beiliegenden CD-ROM unter dem Namen MathVectorV2TestMakefile.<br />

Vorsicht Falle: Immer wenn man glaubt, endlich e<strong>in</strong>e gute Lösung gefunden<br />

zu haben, stolpert man über e<strong>in</strong>en weiteren Aspekt, der die gute<br />

Lösung dann doch nicht so gut aussehen lässt. So auch bei unserer Operatorfunktion:<br />

Nehmen wir e<strong>in</strong>fach an, wir würden e<strong>in</strong>e spezielle Vektor-Klasse<br />

implementieren, die von unserem Basis Vektor abgeleitet ist und die aus irgendwelchen<br />

Gründen e<strong>in</strong>e ger<strong>in</strong>gfügig andere Implementation der Subtraktion<br />

brauchen würde als die Basis. Nun gut, mögen jetzt viele Leser sagen,<br />

dann implementieren wir eben für die Ableitung e<strong>in</strong>e neue Operatorfunktion<br />

für die Subtraktion und die Sache ist gegessen. Leider ist aber die Situation<br />

nicht ganz so e<strong>in</strong>fach. Er<strong>in</strong>nern wir uns daran, dass wir aus Gründen<br />

der Polymorphismus-Eigenschaft von Klassen das dynamic B<strong>in</strong>d<strong>in</strong>g mittels<br />

virtual kennen gelernt haben. Man kann aber nur Methoden als virtual<br />

deklarieren, mit Funktionen geht das nicht! Das bedeutet, dass unsere Operatorfunktion<br />

den Polymorphismus durchbricht! In unserem Fall haben wir<br />

Glück, denn die Operatorfunktion ist so implementiert, dass sie <strong>in</strong> Wirklichkeit<br />

nicht selbst rechnet, sondern den virtual Operator * aufruft. Das muss<br />

aber nicht immer der Fall se<strong>in</strong>.<br />

Wie sorgen wir also nun dafür, dass dieses Loch <strong>in</strong> der Implementation<br />

gestopft wird? Ganz e<strong>in</strong>fach: Wir führen die Konvention e<strong>in</strong>, dass e<strong>in</strong>e<br />

Operatorfunktion niemals selbst e<strong>in</strong>e Operation durchführen darf, sondern<br />

immer nur e<strong>in</strong>e Delegation an e<strong>in</strong>e virtual Methode vornehmen darf. In<br />

dieser steckt dann erst wirklich die Logik der Operation.<br />

E<strong>in</strong> weiteres Beispiel zu diesem Thema, bei dem es essentiell ist, diese<br />

Konvention e<strong>in</strong>zuhalten, f<strong>in</strong>det sich <strong>in</strong> Abschnitt 16.6.<br />

12.2 Typumwandlungen<br />

Oft passiert es, dass verschiedene Datentypen zue<strong>in</strong>ander bis zu e<strong>in</strong>em gewissen<br />

Grad kompatibel s<strong>in</strong>d und dementsprechend auch s<strong>in</strong>nvoll <strong>in</strong>e<strong>in</strong>ander umgewandelt<br />

werden können. Nehmen wir als kle<strong>in</strong>es Beispiel zur Demonstration<br />

e<strong>in</strong>e Klasse RangeControlledInt, die e<strong>in</strong>en Ganzzahlenwert repräsentiert,<br />

dessen gültiger Wertebereich von der Applikation kontrolliert werden kann.<br />

E<strong>in</strong>em Objekt dieser Klasse wird beim Konstruieren der gewünschte gültige<br />

Wertebereich übergeben. Ansonsten soll e<strong>in</strong> solches Objekt voll kompatibel<br />

zu e<strong>in</strong>em <strong>in</strong>t se<strong>in</strong>, mit der e<strong>in</strong>zigen Ausnahme, dass es die Zuweisung von<br />

Werten, die außerhalb des erlaubten Bereichs liegen, nicht zulässt und mit

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!