Aufgabe 1.
template <class TElement>
void GWarteschlange<TElement>::eintragen(const TElement& element) throw (ESchlange_voll) {
schreibindex = schreibindex % groesse + 1; // auf groesse-1 folgt 1
speicher [schreibindex] = element;
zaehler++;
}
else { ESchlange_voll e; throw e; }
}
Aufgabe 2:
class CErsetzbares_Fahrzeug : public CFahrzeug { protected:
CFahrzeug* Ersatz;
}
Aufgabe 3:
(X) richtig Für Klassen, die als verkettete Listen implementiert wurden, sollte die Zuweisung überladen werden.
Grund: Sonst kopiert sie nicht ihren Inhalt, sondern die Verweise (den Anker)
(X) richtig/falsch Abstrakte Datentypen können sowohl in C, wie auch in C++ programmiert werden.
Grund: Als Export von Modulen; ihre Komponenten sind allerdings sichtbar
(X) falsch Ein Konstruktor wird wiederholt ausgeführt, wenn er wiederholt aufgerufen wird.
Grund: Er wird nur einmal beim Erzeugen des Objekts aufgerufen.
(X) falsch Die Modulvererbung erweitert die Schnittstelle einer Klasse immer um mindestens eine Methode, die auf die Datenstruktur der Vaterklasse zugreift.
Grund: Sie kann ihre Arbeit auch über Methoden der Vaterklasse verrichten.
(X) falsch Rückruf kann in C++ mit Schablonen implementiert werden.
Grund: Mit Prozedurparametern; nur in Ada mit Schablonen
(X) richtig Es gibt Zeiger, die Objekte unterschiedlicher, aber nicht aller Datentypen referieren können.
Grund: die polymorphen Zeiger
(X) falsch Wenn eine Ausnahme in C++ ausgelöst aber nicht abgefangen wird, muß sie in der Schnittstelle deklariert werden.
Grund: nur in Java; in C++ ist die Deklaration einer Ausnahme nur Kommentar
(X) richtig Polymorphie kann auch in einem Programm benutzt werden, das keine Zeiger enthält.
Grund: Auch Parameter können polymorph sein (s. CQuadrat)
Aufgabe 4.
#include "STEUER.HPP"
int zahl;
void linke_Taste() { cin >> zahl; }
void rechte_Taste() { cout << zahl; }
void main() {
steuerung(linke_Taste, rechte_Taste);
}
Aufgabe 5.
class CMultibehaelter { ...
friend ostream& operator << (ostream&, const CMultibehaelter);
}
ostream& operator << (ostream& datei, const CMultibehaelter behaelter) {
datei << behaelter.groesse;
for (int i; i < behaelter.groesse; i++)
datei << behaelter.speicher[i]);
}
Aufgabe 6.
void main() {
class CKlasse : public CAufgeschoben {
virtual void ausgabe {}; // oder anderer Rumpf
CKlasse objekt;
objekt.fuellen();
objekt.ausgeben();
}
Aufgabe 7.
void fuellen(const int element) throw(EBehaelter_voll) { behaelter.fuellen(element); }
void entleeren() throw(EBehaelter_leer) { behaelter.entleeren(); }
int inhalt() throw(EBehaelter_leer) { return behaelter.inhalt(); }
bool gefuellt() { return behaelter.gefuellt(); }