C++ Tutorial

Eingeschlossene Objekte

Definition

Ein eingeschlossenes Objekt ist ein Objekt, welches Member einer anderen Klasse ist. Es kann jedem beliebigen Klassentyp angehören, außer der sie umschließenden Klasse. Das Einschließen von Objekten bietet sich immer an, wenn die Klassen zueinander eine hat-eine (has-a) Beziehung haben. Im Beispiel hat das Fenster (die umschließende Klasse Window) eine Farbe (eingeschlossene Klasse Color).

1: // Eingeschlossene Klasse
2: class Color
3: {
4:    ...
5: public:
6:    Color();
7: };
8: // Umschliessende Klasse
9:  class Window
10: {
11:    Color winCol;    // Eingeschlossenes Objekt
12:    ...
13: };

Aufruf des Konstruktors

Besitzt der Konstruktor des eingeschlossenen Objekts Parameter, kann es auf zwei Arten initialisiert werden.

Wird das eingeschlossene Objekt immer mit den gleichen Daten initialisiert, kann bei der Definition des Objekts dieses initialisiert werden.

1: // Eingeschlossene Klasse
2: class Color
3: {
4:    ...
5: public:
6:    Color(int col);
7: };
8: // Umschliessende Klasse
9:  class Window
10: {
11:    // Eingeschlossenes Objekt initialisieren
12:    Color winCol{10};
13:    ...
14: };

Hängt der Initialwert des eingeschlossenen Objekts von einem Parameter der umschließenden Klasse ab, wird der Konstruktor des eingeschlossenen Objekts in der Initialisiererliste des Konstruktors der umschließenden Klasse aufgerufen.

1: // Eingeschlossene Klasse
2: class Color
3: {
4:    ...
5: public:
6:    Color(int col);
7: };
8: // Umschliessende Klasse
9:  class Window
10: {
11:    Color winCol; // Eingeschlossenes Objekt
12:    ...
13: public:
14:    Window (..., int col): winCol{col}
15:    {...}
16:    ...
17: };

Zugriff auf Member

Der Zugriff auf die public-Member des eingeschlossenen Objekts in Methoden der umschließenden Klasse erfolgt in der Art, dass zuerst der Name des eingeschlossenen Objekts angegeben wird, dann der Punktoperator und anschließend das entsprechende Member.

Soll von außerhalb der umschließenden Klasse auf Member des eingeschlossenen Objekts zugegriffen werden, erfolgt der Zugriff 'zweistufig'. D.h., zuerst wird der Name des umschließenden Objekts angegeben, dann der Name des eingeschlossenen Objekts und zum Schluss das Member der eingeschlossenen Klasse. Dieser Zugriff ist nur dann möglich, wenn das eingeschlossene Objekt und dessen Member public sind. Ist das eingeschlossene Objekt als private definiert, ist über das umschließende Objekt kein Zugriff auf das eingeschlossene Objekt möglich.

1: // Eingeschlossene Klasse
2: class Color
3: {
4:    ...
5: public:
6:    void SetColor(...);
7: };
8: // Umschliessende Klasse
9:  class Window
10: {
11: public:
12:    Color winCol;
13:    Window();
14: ...
15: };
16: // ctor der umschliessenden Klasse
17: Window::Window()
18: {
19:    ...
20:    winCol.SetColor(...);
21: }
22: // Fensterobjekt definieren
23: Window winObj;
24:
25: // main() Funktion
26: int main()
27: {
28:    // Zugriff über äusseres Objekt
29:    winObj.winCol.SetColor(...);
30: }

Soll die Schnittstelle des eingeschlossenen Objekts nach außen hin verborgen werden, ist das eingeschlossene Objekt innerhalb der private-Sektion des umschließenden Objekts zu definieren. Um trotzdem auf das eingeschlossene Objekt zugreifen zu können, muss die umschließende Klasse hierfür eine eigene Schnittstelle zur Verfügung stellen. Auf diese Art und Weise kann z.B. die Schnittstelle des eingeschlossenen Objekts umdefiniert werden. Methoden, die die Schnittstelle eines anderen Objekts umdefinieren, werden als Adapter bezeichnet.

Es sei noch angemerkt, dass es auch möglich ist, eine Klasse (nicht ein Objekt!) in einer anderen Klasse einzuschließen. Da dieser Fall aber in der Praxis eher selten auftritt, wird auf eine weitere Erläuterung diesbezüglich verzichtet.


Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz