Aufgabe 1.
template <class TElement>
void GWarteschlange<TElement>::austragen() throw(Eschlange_leer) {
if (zaehler == 0)
throw new ESchlange_leer();
else {
leseindex = leseindex % groesse + 1;
zaehler--;
}
};
Aufgabe 2:
class CVerkettbaresQuadrat : public Quadrat { public:
CVerkettbaresQuadrat* naechstes
};
CVerkettbaresQuadrat q1, q2, q3;
q1.naechstes = &q2; q2.naechstes = &q3;
// alternativ:
CVerkettbaresQuadrat* p1 = new CVerkettbaresQuadrat();
CVerkettbaresQuadrat* p2 = new CVerkettbaresQuadrat();
CVerkettbaresQuadrat* p3 = new CVerkettbaresQuadrat();
p1->naechstes = p2; p2->naechstes = p3;
Aufgabe 3:
- (X) falsch Bei Klassen, die als verkettete Listen
implementiert wurden, muß der Benutzer mit Zeigern
arbeiten.
- Grund: Zeiger werden typischerweise in die Klassen
eingekapselt
- (X) richtig Abstrakte Datentypen können zwar in C
programmiert wurden, sie sind aber nicht wirklich
abstrakt.
- Grund: In C kann keine Kapselung programmiert
werden
- (X) falsch Es gibt keinen Destruktor, der nie
aufgerufen wird.
- Grund: Wenn von der Klasse kein Objekt erzeugt
wurde, wird auch ihr Destruktor nicht aufgerufen.
- (X) falsch Die Typvererbung erweitert die
Schnittstelle einer Klasse immer um mindestens eine
Methode, die auf die Datenstruktur der Vaterklasse
zugreift.
- Grund: Sie kann auch über die Methoden der
Vaterklasse zugreifen
- (X) falsch Rückruf kann in C++ mit Schablonen
implementiert werden.
- Grund: nur in Ada; in C++ gibt es keinen
Prozedurparameter für Schablonenausprägung
- (X) falsch Zeiger in C++ sind typisiert, d.h. sie
können Datenobjekte von genau einem Typ referieren.
- Grund: gilt nicht für Polymorphie
- (X) richtig Ausnahmen können in C++ entweder
abgefangen oder ignoriert werden.
- Grund: wenn ignoriert, dann werden sie weiter nach
oben gereicht
- (X) falsch Verweise referieren in C++
ausschließlich Objekte auf der Halde.
- Grund: nur in Ada83; in C++ können sie durch den
&-Operator auch Stapelobjekte referieren
Aufgabe 4.
#include "FOURIER.HPP"
void ausgabe_in_datei(CFGourier* daten) { datei << text; }
void fertig() {datei.close();};
void main() {
datei.open();
fourier(ausgabe_in_datei, fertig);
}
Aufgabe 5.
void austragen(TFarbe farbe) {
vorhanden(farbe) = false;
}
void ist_vorhanden(TFarbe farbe) {
return vorhanden(farbe);
}
Aufgabe 6.
class CReell : CVirtuell { public:
virtual void ausgabe() {};
}
void main() {
CReel objekt;
objekt.fuellen('x');
objekt.ausgabe();
}
Aufgabe 7.
// MODUL.HPP
typedef GBehaelter<float> TFloat;
void fuellen(TFloat behaelter, const float* element) throw (EBehaelter_voll);
void entleeren(TFloat behaelter) throw(EBehaelter_leer);
float inhalt(TFloat behaelter) throw(EBehaelter_leer);
bool gefuellt(TFloat behaelter);
// MODUL.CPP
void fuellen(TFloat behaelter, const float* element) throw (EBehaelter_voll) {
behaelter.fuellen(element); }
void entleeren(TFloat behaelter) throw(EBehaelter_leer) { behaelter.entleeren(); }
float inhalt(TFloat behaelter) throw(EBehaelter_leer) { return behaelter.inhalt(); }
bool gefuellt(TFloat behaelter) { return behaelter.gefuellt(); }