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.

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

Je mehr man probiert und analysiert, desto besser wird man gewisse Phänomene<br />

kennen lernen und mit ihnen umgehen lernen. Das ist ja gerade der<br />

Grund, warum Erfahrung <strong>in</strong> der <strong>Softwareentwicklung</strong> so viel wert ist!<br />

E<strong>in</strong> kle<strong>in</strong>er Exkurs: Sieht man sich z.B. die Implementation des Subtraktionsoperators<br />

an, so wird hierbei e<strong>in</strong> Objekt result geliefert. In unserem<br />

Fall zieht dieses der Compiler direkt für die Weiterverarbeitung heran. Je<br />

nach Compiler könnte es <strong>in</strong> diesem Fall auch passieren, dass er naiverweise<br />

e<strong>in</strong>e temporäres Objekt als Kopie von result für die Weiterverarbeitung<br />

anlegt. Darunter würde die Performance dieses Operators im Vergleich zum<br />

entsprechenden Kurzzuweisungs Operator natürlich noch zusätzlich leiden.<br />

Ich würde allen Lesern anraten, entsprechende Tests mit ihrer verwendeten<br />

Entwicklungsumgebung durchzuführen.<br />

Vorsicht Falle: Ich habe es hier beim Vektor nicht implementiert, um nicht<br />

völlige Verwirrung zu stiften, aber e<strong>in</strong>e große Falle tut sich, je nach Implementation,<br />

beim Zuweisungs- und beim Vergleichsoperator auf: Was passiert<br />

bei e<strong>in</strong>er Selbstzuweisung bzw. bei e<strong>in</strong>em Vergleich mit sich selbst? In unserem<br />

Beispiel gibt es hierbei e<strong>in</strong> Problem. Deshalb sollte man <strong>in</strong> diesen Fällen<br />

immer gleich als erste Zeile <strong>in</strong> den entsprechenden Operatoren durch e<strong>in</strong>en<br />

Vergleich des Parameters mit this feststellen, ob man nicht gerade mit sich<br />

selbst <strong>in</strong> e<strong>in</strong>er Operation konfrontiert ist. Ist man hierbei unvorsichtig, dann<br />

können sich daraus sehr <strong>in</strong>teressante Debugg<strong>in</strong>g Sessions ergeben :-).<br />

Alle Leser, die spätestens jetzt bed<strong>in</strong>gt durch Angst (hoffentlich nicht)<br />

oder bed<strong>in</strong>gt durch Neugierde (hoffentlich schon) der Spieltrieb gepackt hat,<br />

f<strong>in</strong>den das Makefile zu diesem Programm unter dem Namen<br />

MathVectorV1Test2Makefile auf der beiliegenden CD-ROM.<br />

E<strong>in</strong> kle<strong>in</strong>eres Problemchen gilt es noch bei unserer Klasse MathVector zu<br />

lösen: Das folgende Statement<br />

2.0 * DEC1<br />

kann vom Compiler <strong>in</strong> der jetzigen Version der Klasse nicht verarbeitet werden.<br />

Nach unseren Regeln, die wir oben def<strong>in</strong>iert haben, müsste er jetzt<br />

nämlich im double nach e<strong>in</strong>em Operator suchen, der diesen mit e<strong>in</strong>em<br />

MathVector multipliziert. Den gibt es natürlich nicht. Genau hier kommt<br />

<strong>in</strong>s Spiel, warum ich über die Suche nach den Operatoren gesagt habe, dass<br />

das noch nicht die ganze Wahrheit wäre. Es gibt nämlich sehr wohl e<strong>in</strong>e<br />

Möglichkeit e<strong>in</strong>en Operator zu def<strong>in</strong>ieren, der diesen Fall abdeckt. Jedoch ist<br />

dies ke<strong>in</strong>e Methode unserer Klasse MathVector mehr, sondern e<strong>in</strong>e Funktion,<br />

die zwei Parameter nimmt: e<strong>in</strong>en l<strong>in</strong>ken und e<strong>in</strong>en rechten Operanden.<br />

Ergänzen wir also unseren Header um die Deklaration dieser Funktion und<br />

fügen die Implementation derselben zu unserer Implementation des restlichen<br />

Vektors h<strong>in</strong>zu, dann funktioniert auch das. Das Ergebnis dieses Umbaus s<strong>in</strong>d

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!