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.

22<br />

23 const char ∗ getSymbol ( ) ;<br />

24 void changeSymbol ( const char ∗ symbol ) ;<br />

25 static unsigned getNumInstances ( ) ;<br />

26 } ;<br />

27<br />

28<br />

29 #endif // memory game card v2 h<br />

9.2 E<strong>in</strong>fache Klassen 193<br />

In Zeile 17 sieht man, wie man e<strong>in</strong>e Variable durch e<strong>in</strong>e static Deklaration<br />

zum Class-Member macht. Wie allerd<strong>in</strong>gs bereits aus dem Begriff Deklaration<br />

klar hervorgeht, dient Zeile 17 nur zur Beruhigung des Compilers. Man<br />

sagt ihm, dass es e<strong>in</strong>en Class-Member gibt und dass dieser schon irgendwo def<strong>in</strong>iert<br />

se<strong>in</strong> würde. Die tatsächliche Def<strong>in</strong>ition muss man natürlich an irgende<strong>in</strong>er<br />

Stelle im Programm auch noch h<strong>in</strong>schreiben. Dass dies natürlich nicht<br />

im Header geschehen darf, versteht sich von selbst. Ansonsten würde man<br />

ja Mehrfachdef<strong>in</strong>itionen provozieren, auf die der L<strong>in</strong>ker gar nicht so freundlich<br />

zu sprechen ist. Also wird die Def<strong>in</strong>ition s<strong>in</strong>nigerweise im zur Klasse<br />

gehörigen .cpp File stattf<strong>in</strong>den, wie wir <strong>in</strong> der Folge noch sehen werden.<br />

Auf num_<strong>in</strong>stances_ kann man aus allen Methoden heraus <strong>in</strong> altbekannter<br />

Manier e<strong>in</strong>fach zugreifen. Egal, aus welcher Instanz der Klasse heraus<br />

man zugreift, der Wert ist immer derselbe. Jedoch kann es passieren, dass<br />

man nicht immer e<strong>in</strong>e Instanz e<strong>in</strong>er Klasse zur Verfügung hat, um e<strong>in</strong>e Methode<br />

darauf aufzurufen. Vielleicht will man e<strong>in</strong>fach an irgende<strong>in</strong>er Stelle im<br />

Programm wissen, wie viele Karten existieren, obwohl man an dieser Stelle<br />

gar ke<strong>in</strong>e Instanz der Karte <strong>in</strong> der Hand hat. Zu diesem Zweck deklariert<br />

man dann e<strong>in</strong>e Class Member Methode. Diese ist, wie der Name schon sagt,<br />

auch nicht an e<strong>in</strong>e Instanz gebunden, sondern nur an die Klasse selbst. Intuitiverweise<br />

deklariert man e<strong>in</strong>e solche Methode gleich, wie es schon von<br />

der Variable her bekannt ist, als static. Dies sieht man <strong>in</strong> Zeile 25 unseres<br />

Programms.<br />

Was wir an unserer Implementation der Kartenklasse ändern müssen, um<br />

die Anzahl der Instanzen auch wirklich zu zählen und <strong>in</strong> Zugriff zu haben,<br />

sehen wir an den folgenden Ausschnitten von memory_game_card_v2.cpp:<br />

7 unsigned MemoryGameCard : : num <strong>in</strong>stances = 0;<br />

Wie bereits erwähnt, muss der static Member nicht nur deklariert, sondern<br />

auch def<strong>in</strong>iert werden. Dies geschieht, wie zu erwarten, <strong>in</strong>dem man e<strong>in</strong>fach<br />

die Variable mit dem entsprechenden Scope versieht und damit die Def<strong>in</strong>ition<br />

vornimmt. Hierbei wird allerd<strong>in</strong>gs das Keyword static nicht mehr geschrieben,<br />

denn der Compiler weiß bereits aus der Deklaration um die Natur des<br />

Members und static würde e<strong>in</strong>er weiteren Deklaration entsprechen. Wir<br />

wollen allerd<strong>in</strong>gs e<strong>in</strong>e Def<strong>in</strong>ition erreichen. Dass <strong>in</strong> diesem Statement e<strong>in</strong>e<br />

explizite Initialisierung auf 0 vorgenommen wird, soll nur demonstrieren, wie<br />

man e<strong>in</strong>e Initialisierung auf e<strong>in</strong>en speziellen Wert erreicht. In diesem Fall

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!