Von der Struktur zur Klasse - von C zu C++


Das Arbeiten mit Strukturen in C zeigte entscheidende Nachteile. Ordnung und korrekter Aufbau der header- Dateien bleiben dem Programmierer überlassen. Die Folge ist, daß man sauber programmieren kann - aber nicht muß. Die kritischen Bemerkungen über einzelne C-Programme von anderen Programmierern sind oft nur zu berechtigt.


Weiter kann man mit den Strukturen in C keine wirklichen Datentypen definieren. Denn zu einem Datentyp gehören immer die Darstellung der Daten, die Menge der möglichen Operationen und schließlich die Überwachung durch den Compiler. In C gibt es keine Möglichkeit die richtige Anwendung von Operationen auf Strukturen zu überwachen.

Die Klasse

In C++ erweitern wir die Struktur zur Klasse und damit zu einem vollständigen privaten Datentyp. Dabei fassen wir drei Bereiche einer Informationsdatei in einer Klassendefinition zusammen.


klasse


Von der Struktur zur Klasse - von C zu C++    Seite 35

Die Klasse beinhaltet:

Mit der Klassendefinition wird automatisch der Typname festgelegt. Die Anweisung “typedef” entfällt. Weiter gibt die Klasse nun beides an: wie die Daten aussehen sollen und welche Operationen damit erlaubt sind.

Den Schutzmechanismus, den ein echter Datentyp bieten muß, führt die Klasse durch Schutzbereiche ein. Der erste Bereich heißt “private”. Hier werden Daten oder auch Funktionen deklariert, die niemand von außen benutzen darf. “private” kann entfallen, da es die Standardeinstellung für Elemente einer Klasse ist. Der zweite Bereich heißt “public”. Die hier deklarierten Funktionen und Daten sind von außen zugänglich. Sie bilden die Schnittstelle zu den privaten Elementen der Klasse.

Die in einer Klasse deklarierten Funktionen erhalten eine Zugriffslizenz auf den privaten Teil der Klasse. Sie - und nur sie - dürfen auf die Elemente des privaten Bereiches zugreifen. Ein Element kann eine Variable, eine Funktion oder eine enum-Aufzählung sein.

Begriffe der OOP

C++ und die Objekt-orientierte Programmierung hat einige spezielle Begriffe geprägt. Die Elemente einer Klasse können nun Daten- oder Funktionsdeklarationen sein. Ein Datenelement bezeichnen wir als Eigenschaft einer Klasse. Die zugehörigen Funktionen nennt man nun Methoden. Alle Eigenschaften zusammen bilden den Zustand. Und die Variablen, die wir mit Hilfe der Klassendefinition anlegen, werden Objekte genannt.

In der englischsprachigen Literatur spricht man von Mitgliedern einer Klasse. Dort gibt es Mitgliedsdaten oder Mitgliedsfunktionen (data members / function members). Wir wollen hier die Begriffe Eigenschaften und Methoden benutzen.


Seite 36    Einsteigerseminar C++

Aufbau einer Informationsdatei mit Klassen

Im folgenden Beispiel bauen wir das “ratio”-Beispiel aus dem ersten Kapitel auf die Verwendung einer Klasse um. Betrachten wir die wesentlichen Unterschiede. Anstelle des Schlüsselwortes "struct"” ist “class” getreten. Die Struktur gibt es weiterhin in C++. Sie ist nun ein Sonderfall der Klasse. Sie enthält nur öffentlich zugängliche Elemente. Wir werden sie, im Gegensatz zu vielen anderen Büchern, nicht mehr verwenden.

Das Schlüsselwort “private” könnte weggelassen werden, da dies die Standardeinstellung ist. Die Datenelemente werden aus der Struktur übernommen. Bei der Deklaration der Funktionen finden wir einen wichtigen Unterschied. Es fehlt derjenige Parameter, der beschreibt, mit welcher Variable gearbeitet werden soll. In C verwendeten wir dazu einen Zeiger. Dieser Parameter ist überflüssig geworden, da der Compiler die Zuordnung Variable zu Funktion beim Aufruf automatisch erledigt.

Rahmen3

Im Beispiel sehen Sie auch das neue Kommentarzeichen “//”. Die beiden Schrägstriche leiten einen Kommentar bis zum Zeilenende ein. Die bisherigen Kommentarzeichen “/*” und “*/” für Beginn und Ende eines Kommentares gelten weiterhin. Kommentare, die mit “//” beginnen, dürfen in alten Kommentaren enthalten sein.


Von der Struktur zur Klasse - von C zu C++    Seite 37

Benennung der Informationsdatei

Der Name der Informationsdateien variiert bei verschiedenen Compilerherstellern. Am meisten verbreitet sind “.hpp” und schlicht “.h”. Soll eine Informationsdatei sowohl für C als auch für C++ benutzt werden können, muß man mit Präprozessoranweisungen und bedingter Übersetzung die Unterschiede behandeln. Näheres finden Sie im Kapitel 14 über mehrsprachiges Programmieren.

Implementierung der Methoden

Dem Namen der Methode muß man mit Hilfe des neuen Bereichsoperators ("::") den Namen der zugehörigen Klasse voranstellen. Die Zuordnung der Methode zu einer Klasse benutzt der Compiler zur Überprüfung.

Rahmen5


Seite 38    Einsteigerseminar C++

Innerhalb der Methoden kann der Programmierer auf die Eigenschaften der Klasse direkt zugreifen. Die bei Operatorfunktionen in C notwendige Verwendung von Zeigern entfällt. Methoden sind wegen dieser Regeln etwas kürzer zu schreiben, als gleichartige Operatorfunktionen in C.

Mit Hilfe der beiden vorgestellten Dateien kann nun das Hauptprogramm geschrieben werden.

Rahmen7

Arbeiten mit Objekten

Das Hauptprogramm liest mit Hilfe der “include”-Anweisung die Informationsdatei “ratio.hpp” mit der Klassendefinition ein. In der Zeile 6 werden nun die Objekte, die Strukturvariablen, definiert. Wie in C üblich sind A,B und C globale Objekte. Sie leben während des ganzen Programms und sind von allen Funktionen aus sichtbar.


Von der Struktur zur Klasse - von C zu C++    Seite 39

In den Zeilen 9 bis 12 wird versucht, den Eigenschaften der Objekte Werte zuzuweisen. Dies ist nicht zulässig. Schließlich dürfen nur die Methoden einer Klasse auf die Eigenschaften der Objekte zugreifen. Der Compiler wird mit einer Fehlermeldung reagieren. Die Lösung des Problems der Initialisierung von Objekten werden wir uns im nächsten Kapitel erarbeiten.

Beachten Sie noch den Methodenaufruf in den Zeilen 13 und 15. Ganz allgemein kann man mit dem Punktoperator auf Elemente einer Struktur oder eines Objektes zugreifen. Da nun auch Methoden Elemente der Klasse sind, mit der das Objekt angelegt wurde, kann man auch Methoden mit einem Punkt für ein bestimmtes Objekt aufrufen.

Der Compiler weiß an Hand des Punktes, mit welchem Objekt bei diesem Methodenaufruf gearbeitet werden soll und wird dafür sorgen, daß alle Zugriffe auf Eigenschaften oder Methoden innerhalb der Methode korrekt erfolgen. Wegen dieser Dienstleistung des Compilers konnten wir innerhalb der Methoden direkt auf die Namen der Elemente zugreifen.

privatefehler


Seite 40    Einsteigerseminar C++

In der Ausgabe der Zeile 14 wird ein ANSI-Steuersequenz zum Löschen des Bildschirms ausgegeben. Das Programm setzt ein ANSI-Terminal (oder einen installierten ANSI-Treiber) voraus.

Bindung

Man sagt, daß bei einem Aufruf einer Methode mit Hilfe des Punktoperators eine frühe Bindung an das Objekt erfolgt. Der hier benutzte Begriff “Bindung” hat nichts mit dem Linken oder Binden des Linkers zu tun. Er beschreibt in der OOP, der Objekt-Orientierten Programmierung, die Zuordnung des Objektes an die aufgerufene Methode.

Technisch wird die Bindung durch einen verdeckten Parameter erreicht. Beim Aufruf wird die Adresse des zu bearbeitenden Objektes in einem unsichtbaren Parameter übergeben. In allen Methoden kann man auf den Wert dieses Parameters mit dem Schlüsselwort “this” zugreifen.


Rahmen11

In der Verwendung sieht das Schlüsselwort “this” wie ein Zeiger auf das gerade bearbeitete Objekt aus. (this ist intern tatsächlich ein Zeiger):

Diese Art der Bindung wird als frühe Bindung bezeichnet. Früh bedeutet, daß der Compiler zur Übersetzungszeit festlegen kann, wo die Adresse herkommt und welche Methode aufzurufen ist. Im Kapitel über Polymorphismus (oder späte Bindung) sehen wir dann das Gegenstück zur frühen Bindung.


Von der Struktur zur Klasse - von C zu C++    Seite 41

Botschaftenkonzept und andere Begriffe

Die genannten Begriffe werden in der Literatur nicht einheitlich verwendet. Die Begriffe “Eigenschaft” und “Methode” stammen aus den klassischen OOP-Sprachen. Bei C++ werden in der Sprachbeschreibung die englischen Begriffe "data member” für die Eigenschaft und “member function” für die Methode verwendet. Zu den Objekten aus C++ sagen andere Sprachen “Instanz einer Klasse” und, anstelle ein Objekt anzulegen, instanziieren sie es. In der OOP spricht man auch nicht von einem Aufruf der Methoden. Man sagt, daß man an ein Objekt eine Botschaft mit Parametern sendet. Um eine möglichst einfache Darstellung zu erreichen, werden wir erst nach und nach die Begriffe verwenden. Vorläufig bleiben wir aber noch bei der vertrauten Ausdrucksweise.

Erweiterung des Beispiels

Unser “ratio”- Beispiel ist bisher noch nicht sinnvoll zu verwenden. Rationale Zahlen umfassen die ganzen Zahlen und die Bruchzahlen. Im Laufe des Buches werden wir für rationale Zahlen alle 4 Grundrechenarten entwickeln.

Hinweise zur Weiterarbeit


1) Welche Auswirkung hat die Kapselung
- für den Programmierer
- für die Wartung von Programmen
- für Anbieter von Spezial-Klassen
- für die Sicherheit der Programme?

2) Welche Grundfunktionalitäten benötigen wir, um Objekte zu bearbeiten?

3) Welchem Teil der bisherigen Operatorfunktionen entspricht "this"?

Im nächsten Kapitel

Momentan fehlt uns noch eine Möglichkeit, überhaupt Werte in die Eigenschaften zu bringen. Die üblichen Verfahren sind dabei Initialisierung und Zuweisung. Da nur Methoden auf die privaten Elemente zugreifen dürfen, werden wir dazu im nächsten Kapitel entsprechende Methoden schreiben.


Seite 42    Einsteigerseminar C++