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.

204 9. Klassen <strong>in</strong> <strong>C++</strong><br />

wir kurz: Unsere abgeleitete Klasse hat e<strong>in</strong>en Konstruktor mit 2 Parametern,<br />

die Basisklasse hat nur e<strong>in</strong>en mit e<strong>in</strong>em Parameter. Wie also soll nun<br />

der Compiler wissen, wie er den Konstruktor der Basisklasse aufruft? Genau<br />

das ist es, was wir mit diesem Konstrukt erreichen, nämlich dass wir explizit<br />

den Aufruf e<strong>in</strong>es bestimmten Konstruktors mit e<strong>in</strong>em bestimmten von uns<br />

vorgegebenen Parameter veranlassen. In diesem Fall bewirken wir den Aufruf<br />

des Konstruktors auf die Art, dass die Rückseite der Karte nach dem<br />

Konstruieren sichtbar ist.<br />

Die Regel, die der Compiler beim impliziten E<strong>in</strong>setzen von Konstruktoraufrufen<br />

befolgt, ist e<strong>in</strong>fach: Er sucht <strong>in</strong> der Basisklasse immer nach e<strong>in</strong>em<br />

Konstruktor mit genau demselben Parametersatz, wie ihn der Konstruktor<br />

der abgeleiteten Klasse besitzt. Gibt es e<strong>in</strong>en solchen, kann der Compiler<br />

den impliziten Aufruf e<strong>in</strong>setzen, wenn nicht, dann führt dies zu e<strong>in</strong>em Fehler.<br />

Dann s<strong>in</strong>d wir also zum expliziten Aufruf gezwungen.<br />

Vorsicht Falle: Neul<strong>in</strong>ge und Entwickler, die aus der Java-Welt kommen,<br />

sitzen oft dem Irrtum auf, dass der Compiler implizit immer nur den default<br />

Konstruktor aufruft, falls e<strong>in</strong> solcher existiert. Dies ist falsch! E<strong>in</strong>e solche<br />

Fehlannahme kann natürlich zu ganz <strong>in</strong>teressanten Fehlern führen, die man<br />

lange sucht :-).<br />

Um hier nicht zu stark vom Thema abzukommen, möchte ich e<strong>in</strong>e genauere<br />

Diskussion über den Aufruf von Konstruktoren und Destruktoren auf<br />

später verlegen, ebenso wie e<strong>in</strong>e Abhandlung, was man nach diesem om<strong>in</strong>ösen<br />

Doppelpunkt noch so alles tun kann. Im Augenblick genügt es, zu wissen,<br />

dass man auf diese Art den Compiler zufrieden stellen kann und er den richtigen<br />

Konstruktor mit unseren gewünschten Parametern aufrufen wird.<br />

Vorsicht Falle: E<strong>in</strong> oftmaliger Fehler von Neul<strong>in</strong>gen <strong>in</strong> C ++ besteht dar<strong>in</strong>,<br />

dass der explizite H<strong>in</strong>weis auf den aufzurufenden Konstruktor fehlt, die<br />

Basisklasse aber ke<strong>in</strong>en entsprechenden Konstruktor zur Verfügung stellt,<br />

der implizit e<strong>in</strong>gesetzt werden könnte. Darüber beschwert sich natürlich der<br />

Compiler und will das Programm partout nicht fertig übersetzen. E<strong>in</strong> kurzer<br />

Blick auf die Implementation der Konstruktoren schafft hier Klarheit. Abhilfe<br />

<strong>in</strong> Form e<strong>in</strong>es expliziten H<strong>in</strong>weises an den Compiler lässt diesen dann <strong>in</strong><br />

puncto Fehlermeldungen weniger lautstark ans Werk gehen :-).<br />

Interessant ist auch noch das Testprogramm, denn dar<strong>in</strong> sieht man, wie<br />

man eigentlich überhaupt mit abgeleiteten Klassen umgeht<br />

(memory_game_card_v3_test.cpp):<br />

1 // memory game card v3 test . cpp − t e s t program f o r MemoryGameCard<br />

2<br />

3 #<strong>in</strong>clude <br />

4 #<strong>in</strong>clude ”memory game card v3 . h”<br />

5<br />

6 us<strong>in</strong>g std : : cout ;

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!