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.

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

vergessen, so haben wir e<strong>in</strong> wunderbar wachsendes Programm erzeugt, wobei<br />

die Ursache für das entstandene Speicherloch ausgesprochen schwer zu f<strong>in</strong>den<br />

ist und den Entwicklern sicherlich e<strong>in</strong>ige lange Nächte beschert.<br />

Vorsicht Falle: Wie wir gesehen haben, s<strong>in</strong>d selbstdef<strong>in</strong>ierte Typumwandlungs-Operatoren<br />

auf Po<strong>in</strong>ter-Typen e<strong>in</strong>e ziemlich heikle Angelegenheit, bei<br />

der sehr viel schief gehen kann. In unserem Fall wird durch die Def<strong>in</strong>ition<br />

e<strong>in</strong>er expliziten Umwandlungsmethode, wie weiter oben vorgeschlagen wurde,<br />

auch nur e<strong>in</strong> Teil des Problems gelöst, die Zeitbombe “Array” bleibt allerd<strong>in</strong>gs<br />

<strong>in</strong> e<strong>in</strong>er oder der anderen Form bestehen. Ich kann also allen Lesern hier nur<br />

Folgendes raten:<br />

Das Mischen von Objekten mit dazu (teil-)kompatiblen Array-Datentypen<br />

ist pr<strong>in</strong>zipiell zu vermeiden!<br />

Sollte man aus irgendwelchen Gründen auf e<strong>in</strong>e solche Funktionalität<br />

nicht verzichten können, so sollte man dafür e<strong>in</strong>e eigene Zugriffsmethode<br />

implementieren (und ihre Gefahren gut dokumentieren :-)).<br />

Vorsicht Falle: Manchmal wird <strong>in</strong> gewissen Designs dem Compiler zu viel<br />

zugetraut, haben doch implizite Typumwandlungen durch den Compiler auch<br />

ihre Grenzen. Der Compiler weigert sich (zum Glück), mehrere verschiedene<br />

Umwandlungen h<strong>in</strong>tere<strong>in</strong>ander auszuführen. Was das bedeutet, kann man<br />

leicht am folgenden Beispiel erkennen:<br />

Nehmen wir an, wir hätten e<strong>in</strong>e Klasse IntStore, die e<strong>in</strong>e Typumwandlung<br />

auf <strong>in</strong>t32 besitzt:<br />

1 class IntStore<br />

2 {<br />

3 // Constructor , Destructor , etc . . .<br />

4<br />

5 virtual operator <strong>in</strong>t32 ( ) const ;<br />

6 } ;<br />

Weiters hätten wir e<strong>in</strong>e Klasse CommonStore, die e<strong>in</strong>e Typumwandlung auf<br />

IntStore unterstützt:<br />

1 class CommonStore<br />

2 {<br />

3 // Constructor , Destructor , etc . . .<br />

4<br />

5 virtual operator IntStore ( ) const ;<br />

6 } ;<br />

Und nun schreiben wir Folgendes:<br />

CommonStore my_store;<br />

<strong>in</strong>t32 my_var = 10 + my_store;<br />

Manche Leser mögen nun glauben, dass die Berechnung funktionieren sollte,<br />

denn der Compiler kann ja zuerst die Umwandlung von my_store auf e<strong>in</strong><br />

Objekt vom Typ IntStore e<strong>in</strong>setzen. Da dieses dann e<strong>in</strong>e Umwandlung auf<br />

<strong>in</strong>t32 unterstützt, wäre der Fall erledigt.<br />

Der Compiler jedoch sieht das anders, denn er betrachtet nur die Umwandlungen,<br />

die von CommonStore selbst zur Verfügung gestellt werden. Da

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!