|
als abstrakte Klasse ohne Implementierungsteil class Stack {
public:
//--------------------
// die Attribut-Funktionen
virtual
int isEmpty() const = 0;
virtual
int top() const = 0;
//--------------------
// die modifizierenden Funktionen
virtual
Stack & push(int e) = 0;
virtual
Stack & pop() = 0;
//--------------------
// die Vorbedingungen
virtual // oder nicht ???
int pre_pop() const {
return
! isEmpty();
}
virtual
int pre_top() const {
return
! isEmpty();
}
//--------------------
// der Destruktor
virtual
~Stack() {}
};
|
| Das späte Binden muss explizit durch das Schlüsselword virtual gekennzeichnet werden. | |
| Eine Klasse ist abstrakt, wenn mindestens eine Funktion als abstrakt gekennzeichnet ist: ... = 0; |
|
eine konkrete Implementierung der Stack Klasse #include "Stack.cc"
class SimpleStack : public Stack {
private:
// die Datenfelder: nicht nach aussen sichtbar
struct StackStruct {
unsigned top;
int elems[100];
} * s;
public:
//--------------------
// der Konstruktor
SimpleStack() {
s = new StackStruct;
s->top = 0;
}
//--------------------
// der Destruktor
~SimpleStack() {
delete s;
}
//--------------------
// die Attribut-Funktionen
virtual
int isEmpty() const {
return
s->top == 0;
}
virtual
int top() const {
return
s->elems[s->top-1];
}
//--------------------
// die modifizierenden Funktionen
virtual
Stack & push(int e) {
s->elems[s->top++] = e;
return
*this;
}
virtual
Stack & pop() {
s->top--;
return
*this;
}
// Vorbedingungen sind schon implementiert
};
|
| Unterschiede zwischen Objekten und Referenzen | |
|
Speicherfreigabe muss explizit programmiert werden. Sehr fehlerträchtig. |
|
| Innerhalb einer Klasse wird immer noch mit expliziten Zeigern gearbeitet. |
| Letzte Änderung: 31.12.2006 | © Prof. Dr. Uwe Schmidt |