Erste Klasse in C++

Erschaffen wir uns einen zweidimensionalen Vektor (engl. vertex). Eine kurze Erklärung zu Vektormathematik gibt es hier. Das Projekt steht hier zum Download.

Definition in der Header-Datei

Header-Datei vertex.h:

// mehrfaches Einbinden durch Präprozessor verhindern
#ifndef _VERTEX_H_
#define _VERTEX_H_

class CVertex               // deklariere eine Klasse für Vektoren
{
  public:                   // nachfolgende Elemente sind öffentlich

    CVertex();              // Kunstuktor
    ~CVertex();             // Destruktor

    float length();         // Länge berechnen
    CVertex add(CVertex v); // Vektor hinzuaddieren und Ergebnis zurückgeben

    float x, y;             // zweidimensionale Koordinaten (Attribute)

}; // Klassendeklaration auch mit Semikolon abschließen!

#endif // _VERTEX_H_

Es gibt verschiedene Namenskonventionen bei der Benennung von Typen, Methoden und Attributen. Hier wurden der Lesbarkeit halber nur ein großes C (Class) vor dem Klassennamen gewählt.

Um unsere erste Klasse sehr einfach zu halten, sind alle Elemente public, also öffentlich zugänglich. Wir werden später sehen, dass es ganz vorteilhaft ist, nur so viele Elemente wie notwendig als public zu deklarieren.

Konstruktion und Destruktion

Der Konstruktor einer Klasse dient dazu, die Attribute des Objekts auf Standardwerte zu setzen, also zu initialisieren. Der Destruktor dient dazu, bei Löschen des Objektes aufzuräumen, z.B. falls das Objekt dynamisch Speicher belegt hat.

Beim Erzeugen eines Objekts wird automatisch der Konstruktor aufgerufen, bei Verlassen des Blocks, in dem das Objekt gültig ist, der Destruktor. Beide wurden eingeführt, da sich sonst Programmierfehler durch nicht initialisierte oder korrekt aufgeräumte Attribute einschleichen würden.

Dem Konstruktor können weitere Parameter übergeben werden. In unserem Fall reicht aber der sogenannte Standardkonstruktor. Da der Destruktor automatisch aufgerufen wird, können keine Parameter an ihn übergeben werden.

Definition (Implementierung) in der C++-Datei

In der Header-Datei haben wir, wie gesagt, die Klasse mit ihren Funktionen und Attributen nur deklariert. Konstruktor, Destruktor und die beiden Methoden length und add müssen noch implementiert werden. Dies geschieht in einer C++-Datei, in unserem Fall in vertex.cpp.

Die Implementierung einer Methode wie z.B. length besitzt in C++ den folgenden, generellen Aufbau:

rückgabetyp klasse::name(typ1 param1, typ2 param2, ...)
{
    // Anweisungen und Berechnungen folgen hier
    // Ergebnis zurückgeben
    return rückgabewert;
}

Soll nichts zurückgegeben werden, schreiben wir (wie in apfel.h) void als Rückgabetypen. Dann fällt auch der return Befehl weg. Sowohl Konstruktor als auch Destruktor sind Sonderfälle und haben keinen Rückgabewert. Wie oben ersichtlich, können auch Klassen als Typen übergeben werden.

Sehen wir uns die Implementierung in der C++-Datei vertex.cpp an:

// Einbinden der Deklaration unserer Klasse
#include "vertex.h"

// Einbinden mathematischer Funktionen
#include <math.h>

CVertex::CVertex()
{
    x = y = 0.0f; // setze Attribute auf Standardwerte
}

CVertex::~CVertex()
{
    // Nichts aufzuräumen
}

float CVertex::length()
{
    // Wurzel aus x hoch 2 + y hoch 2
    return sqrt(x*x + y*y);
}

CVertex CVertex::add(CVertex v)
{
    // Addiere einen Vektor zu unserem und gib das Ergebnis zurück
    // (unser Vektor wird nicht verändert)
    CVertex result;
    result.x = x + v.x;
    result.y = x + v.y;
    return result;
}

Das ist schon alles. Auf die Attribute x und y können wir innerhalb der Member-Funktionen von CVertex einfach zugreifen. Handelt es sich um ein fremdes Objekt (wie den Vektor v der add Methode), schreiben wir v.x bzw. v.y. Auf öffentliche Attribute und Funktionen einer Objekts können wir also durch einen zwischengestellten Punkt zugreifen.

Verwenden der Klasse

Verwenden wir die Klasse in main.cpp:

// Einbinden der Deklaration unserer Klasse
#include "vertex.h"

#include <iostream>
using namespace std;

int main()
{
    // Vektor Instanz erzeugen (dabei wird der Konstruktor aufgerufen)
    CVertex a;
    cout << a.length() << endl;

    // Setze x und y auf 1
    a.x = 1.0f;
    a.y = 1.0f;
    cout << a.length() << endl;

    // Noch einen Vektor erzeugen
    CVertex b;
    b.x = -1.0f;
    b.y = 1.0f;

    // Addieren
    CVertex c = a.add(b);
    cout << "(" << c.x << ", " << c.y << ")" << endl;

    return 0;
}

Das Programm gibt wie erwartet 0, die Wurzel von zwei und "(0, 2)" aus.

Selbständige Programmierung
  • Programmiere eine Funktion, die einen zweiten Vektor von unserem subtrahiert und das Ergebnis zurückliefert
  • Programmiere eine print Methode, die die Koordinaten des Vektors selbständig auf cout ausgibt. Alle Includes berücksichtigt?
  • Wann werden Konstruktor und Destruktor aufgerufen? Gebe im Konstruktor und Destruktor der Vektorklasse etwas aus. Was passiert in der add Methode?
  • Erweitere die Vektorklasse auf die dritte Dimension

zurück