Beispiel einer einfachen Klasse...
...verteilt auf zwei Quellcode-Dateien

Das folgende Beispiel zeigt eine kleine Klasse zur Verarbeitung von Kalenderdaten. Es soll gezeigt werden, wie der Quellcode der Klasse vom Rest des Quellcodes abgetrennt wird. Für grndsätzliche Fragen zum Thema Aufteilung von Quellcode auf mehrere Dateien, siehe das Skript und das vorherige Beispiel.

Die Klasse cDate speichert Tag, Monat und Jahr eines Datums, sowie einen frei wählbaren Namen des Datums in privaten Attributen. Folgende öffentliche Methoden stehen zur Verfügung:

cDate();
Konstruktor der Klasse. Er wird automatisch aufgerufen und muss bei der Verwendung der Klasse nicht weiter beachtet werden. Mit dem Konstruktor wird in diesem Beispiel ein logisches Anfangsdatum gesetzt und der Zeiger für die Speicherreservierung auf NULL gesetzt.
~cDate();
Der Destruktor der Klasse wird automatisch aufgerufen und muss bei der Verwendung der Klasse nicht weiter beachtet werden. In diesem Beispiel sorgt der er dafür, dass am Ende der reservierte Speicher wieder freigegeben wird.
bool setDate(int newDay, int newMonth, int newYear, char *name);
Mit dieser Methode wird ein Datum in der Klasse gespeichert. Ist das Datum ungültig (z.B. 30.2.2008), so wird es nicht gespeichert. Für den übergebenen Text wird Speicher reserviert.
int getDay();
Gibt den gespeicherten Tag zurück.
int getMonth();
Gibt den gespeicherten Monat zurück.
int getYear();
Gibt das gespeicherte Jahr zurück.
char *getName();
Gibt den gespeicherten Text zurück. Liegt kein Text vor, so wird eine leere Zeichenkette zurückgegeben.

Neben den öffentlichen gibt es noch zwei private Methoden:

bool setName(char *newText);
Mit dieser Methode wird der Name des Datums gesetzt. Sie übernimmt gleichzeitig die dynamische Speicherverwaltung.
bool correctDate(int day, int month, int year);
Diese Methode überprüft die Gültigkeit des übergebenen Datums.

Das Programm erzeugt folgende Ausgabe:

    Der alte mit 'd', der neue mit 'D':
    Tag der deutschen Einheit: 17.6.1954
    Tag der Deutschen Einheit: 3.10.1990
    Press any key to continue

Die Headerdatei Date.h

//================================================================
// A little class to demonstrate OOP spread over two source files.
// author: Robert Hess
// date: December 28th 2007
// version 1.00
// filename: Date.h
//================================================================

#ifndef CLASS_CALENDAR_DATE_BY_ROBERT_HESS_INCLUDED
#define CLASS_CALENDAR_DATE_BY_ROBERT_HESS_INCLUDED

class cDate {

private:
    int year;
    int month;
    int day;
    char *name;

    bool setName(char *newText);
    bool correctDate(int day, int month, int year);

public:
    cDate();
    ~cDate();
    bool setDate(int newDay, int newMonth, int newYear,
                 char *name);
    int getDay();
    int getMonth();
    int getYear();
    char *getName();

};

#endif // #ifndef CLASS_CALENDAR_DATE_BY_ROBERT_HESS_INCLUDED

Die Quellcodedatei Date.cpp

//================================================================
// A little class to demonstrate OOP spread over two source files.
// author: Robert Hess
// date: December 28th 2007
// version 1.00
// filename: Date.cpp
//================================================================

#include "Date.h"
#include <stdlib.h>
#include <string.h>

//================================================================

// constructor
cDate::cDate()
{
    // initialize date to Jan 1st 2000 with no name
    day = 1;
    month = 1;
    year = 2000;
    name = NULL;
}

//================================================================

// destructor
cDate::~cDate()
{
    // free memory
    if(name) delete[] name;
}

//================================================================

// set date from outside of class
bool cDate::setDate(int newDay, int newMonth, int newYear,
                    char *name)
{
    // if date is not corret return
    if(!correctDate(newDay, newMonth, newYear)) return true;

    // set new date
    day = newDay;
    month = newMonth;
    year = newYear;

    // set name and return error status
    return setName(name);;
}

//================================================================

// get the stored day
int cDate::getDay()
{
    // return the private attribute for the day
    return day;
}

//================================================================

// get the stored month
int cDate::getMonth()
{
    // return the private attribute for the month
    return month;
}

//================================================================

// get the stored year
int cDate::getYear()
{
    // return the private attribute for the year
    return year;
}

//================================================================

// get the stored name of the date
char *cDate::getName()
{
    // if memory has been allocated return stored string,
    // else return empty string
    return name?name:"";
}

//================================================================

// validates the given date
bool cDate::correctDate(int day, int month, int year)
{
    bool error=false;    // error flag
    int maxDay=31;        // maximum value for day

    // check for positive year
    error = error || year<=0;

    // check month
    error = error || month<1 || month>12;

    // check day
    if(!error && (month==4 || month==6 || month==9 || month==11))
        maxDay = 30;
    if(!error && month==2) {
        maxDay = 28;
        if(year%4==0) maxDay = 29;
        if(year%100==0) maxDay = 28;
        if(year%400==0) maxDay = 29;
    }
    error = error || day<1 || day>maxDay;

    // return true for correct dates
    return !error;
}

//================================================================

// handles the names
bool cDate::setName(char *newText)
{
    // free previous memory
    if(name) delete[] name;

    // get new memory
    name = new char[strlen(newText)+1];
    if(name==NULL) return true;

    // copy name
    strcpy(name, newText);

    return false;
}

Die Quellcodedatei main.cpp

//================================================================
// A little class to demonstrate OOP spread over two source files.
// author: Robert Hess
// date: December 28th 2007
// version 1.00
// filename: main.cpp
//================================================================

#include "Date.h"
#include <stdio.h>

int main()
{
    // Speicher für zwei Daten
    cDate Einh1, Einh2;

    // Daten setzen
    Einh1.setDate(17, 6, 1954, "Tag der deutschen Einheit");
    Einh2.setDate(3, 10, 1990, "Tag der Deutschen Einheit");

    // Daten ausgeben
    printf("Der alte mit 'd', der neue mit 'D':\n");
    printf("%s: %d.%d.%d\n", Einh1.getName(), Einh1.getDay(),
           Einh1.getMonth(), Einh1.getYear());
    printf("%s: %d.%d.%d\n", Einh2.getName(), Einh2.getDay(),
           Einh2.getMonth(), Einh2.getYear());

    return 0;
}

Verwendung des Beispiels unter Microsoft Visual C++ Version 6

Gehen Sie unter Verwendung der passenden Dateinamen wie im vorherige Beispiel vor.

Seite 19