Dies ist eine alte Version des Dokuments!


Eine Klasse definieren

Sobald man in C++ programmiert, ist jede Struktur bereits eine Klasse.

struct Tier
{
  int  AnzahlBeine;
};

Eine Klasse wird jedoch in der Regel mit class deklariert:

class Tier
{
public:
  int  AnzahlBeine;
};

Das Keywort public bedeutet, dass das nachfolgende Feld öffentlich sichtbar ist. Das ist bei einer Struktur der Standardfall. Bei einer Klasse ist der Standardfall private, deswegen muss das Feld erst sichtbar geschaltet werden. Die genaue Bedeutung von public und private findet sich im Kapitel Sichtbarkeit (Information Hiding).

Wo beschreibt man eine Klasse?

Grundsätzlich kann man eine Klasse überall beschreiben. Innerhalb einer Funktion, innerhalb einer anderen Klasse oder eben global außerhalb jeglicher Klassen und Funktionen. Sie ist dann aber auch nur in dem Bereich sichtbar, in dem sie deklariert wurde. Wurde sie innerhalb einer Funktion definiert, so kann man außerhalb der Funktion nichts mit ihr anfangen. Wird sie in einer .cpp-Datei deklariert, so ist sie nur in dieser einen Datei sichtbar.

Eine Klasse wird daher in der Regel in einer Header-Datei (.h-Datei) beschrieben, so dass die Deklaration von beliebigen Quelltexten (.cpp-Dateien, aber auch .h-Dateien) geladen werden kann.

Häufig setzt man einen sogenannten Include-Guard vorab, der dafür sorgt, dass die Deklarationen innerhalb der Headerdatei sich nicht wiederholen. Der Inhalt der Datei wird dann ignoriert. Hierfür wird der Präprozessor verwendet, der - falls die Datei schon eingebunden wurde - den Inhalt beim wiederholten Versuch einfach ausblendet. Für unsere Tier-Klasse sähe das so aus:

#ifndef TIER_H
#define TIER_H
 
struct Tier
{
  int  AnzahlBeine;
};
 
#endif // TIER_H

Zuerst wird gefragt „Wenn TIER_H“ noch nicht definiert (#ifndef oder lang #if not defined) ist, dann definiere TIER_H und alles weitere bis zum Endif. Wurde die Datei tier.h bereits eingebunden, so ist TIER_H bereits definiert und der Text zwischen #ifndef und #endif wird nicht erneut an den Compiler übergeben. Fehlt so ein Include-Guard, beschwert sich der Compiler, dass der Typ Tier mehrfach deklariert wurde.

Jedes Header-File muss ein eigenes Define haben. Würden sich mehrere Header-Dateien auf das gleiche Define berufen, würde ja nur diejenige gelesen, die zuerst eingebunden wurde. Das ist ein beliebter Fehler, wenn Include-Dateien kopiert werden. Die Lösung, ein passenden Namen zu finden ist hier vergleichweise einfach: Man nimmt einfach den Dateinamen der Header-Datei und hängt ggfs. noch ein Präfix vorab, zum Beispiel INCLUDE_TIER_H.

Diese Headerdatei kann nun von beliebigen .cpp-Dateien per #include „tier.h“ eingebunden und verwendet werden, so dass allen die Klasse Tier bekannt ist.