Aufgabe 1.

template <class TElement>

void GWarteschlange<TElement>::eintragen(const TElement& element) throw (ESchlange_voll) {

  • if (zaehler < groesse) { // Anzahl der gespeicherten Elemente

    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.

  • GBehaelter<int> behaelter;

    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(); }