home |
15. Teilobjekte und statische Elemente |
|
Druckversion dieser Seite |
Ziele
|
|
Teilobjekte und deren Initialisierung |
||
Gewisse Objekte, die wir in C++ abstrahieren wollen bestehen aus gewissen anderen und enthalten diese. Nehmen wir an wir schreiben eine Renn-Simulation in der Autos vorkommen. Nehmen wir weiter an, dass ein Programmierer sich nur um die Räder eines Autos kümmert um grössmögliche Realität zu erreichen. Ein anderer Programmierer beschäftigt sich dann mit dem Auto als Ganzes. Ein Auto hat vier Räder, man spricht von einer Hat-Beziehung. Das könnte ungefähr so aussehen : |
||
|
||
Ein Auto besteht also aus vier Rädern. | ||
Angenommen die Klasse Rad hat nur einen speziellen Konstruktor, der als Parameter den Radius des Rades hat : | ||
|
||
Ein Konstruktor mit Parametern führt dazu, dass der Compiler keinen Konstruktor ohne Parameter mehr zur Verfügung stellt (ausser er wird explizit definiert). Der Programmierer der Klasse Rad wollte aber wohl nicht, dass jemand den Defaultkonstruktor verwendet. | ||
Da beim Erzeugen eines Objektes der Klasse Auto auch alle Teilobjekte - also auch alle Räder - mit dem default-Konstruktor erzeugt werden wollen, wird die Klasse Auto nicht mehr compilieren. Um Teilobjekte mit Parametern zu initialisieren gibt es die Möglichkeit eine Initialisierungsliste zu verwenden. Hier der Konstruktor der Klasse Auto mit Initialisierungsliste : | ||
|
||
Vor der {-Klammer des Konstruktors kommt ein : (Doppelpunkt) und danach die Datenelement mit dem speziellen Kosntruktorparameter. Auch andere Datenelemente können mittels Initialisierungsliste erzeugt werden. Hier als Beispiel der Konstruktor der Klasse Rad : | ||
|
||
Der Konstruktor könnte aber auch so aussehen : | ||
|
||
Der Konstruktor von Auto muss aber die Initialisierungsliste verwenden, denn die Rad hat nur einen Konstrukto mit Parametern. | ||
Konstanten müssen auf die gleiche Art initialisiert werden ! | ||
|
||
Statische Datenelemente |
||
Die Eigenschaften eines jeden Objektes sind in seinen Datenelementen gespeichert. Ein Objekt unterscheidet sich von einem anderen durch seine Datenelemente. Es gibt manchmal aber auch Daten, die nicht nur zu einem Objekt gehören, sondern nur einmal für die ganze Klasse existieren müssen. | ||
Ein Beispiel, das man häufig antrifft, ist wenn man die Anzahl der Objekte einer bestimmten Klasse zählen will. Man verwendet hierfür statische Variablen, die mit dem Schlüsselwort static definiert werden. | ||
|
||
Erzeugen wir ein Objekt der
Klasse Rad, werden die Datenelemente die zu diesem Objekt gehören automatisch
im Speicher erzeugt, das heisst wenn wir ein Rad erzeugen wird im Speicher
auch gleich ein long für m_radius und ein double für m_pi erzeugt.
Da s_anzahlRaeder aber nicht direkt zu einem einzelnen Objekt gehört, muss diese statische Variable speziell initialisiert werden (siehe oben). Übrigens wäre es für m_pi auch nicht nötig, dass jedes Objekt ein eigenes Datenelement m_pi besitzt. Man könnte also pi auch als statische Variable von Rad definieren ! |
||
Statische Elementfunktionen |
||
Da ein statisches Datenelement existieren kann ohne, dass es ein Objekt gibt kann man Elementfunktionen (Methoden) definieren, die den Zugriff auf solche Datenelemente ermöglichen. Die Methoden werden auch statisch definiert und können so unabhängig von einem Objekt aufgerufen werden: | ||
|
||
Hier das main.cpp zum herunterladen, mit dem kompletten Beispiel. | ||
Klassenspezifische Konstanten, enum |
||
Mit enum kann ganz einfach eine Aufzählung definiert werden. | ||
|
||
Der erste Wert in einer Aufzählung bekommt den numerischen Wert 0, die folgenden immer den um eins erhöhten des Vorgängers, hier also gelb = 1 und gruen = 2. | ||
Diese Werte können aber auch beeinflusst werden : | ||
|
||
"rot" hat jetzt den Wert 10, gelb den Wert 11 und gruen den Wert 15. | ||
Ein solcher enum kann auch in einer Klassen definiert werden und gehört dadurch zur Klasse. Hier ein komplettes Beispiel dazu (mit download): | ||
|
||