OOP mit Java: Abstrakte Datentypen in C++ |
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: 29.04.2013 | © Prof. Dr. Uwe Schmidt |