Skip to Content

Fehlersuche

Jede Klausur startet mit einer Fehlersuche. Hier wird ein Codeausschnit gegeben und dieser kann einen oder mehrere Fehler enthalten. Der Fehler muss dann durchs markieren der Fehlerstellen gelöst werden.

Aufgabe 1:

Gegeben sei das folgende C++-Programm, das eine vereinfachte Version der Addition von Brüchen (ohne Kürzen) mittels Operatorüberladung realisieren soll:

Erwartete Ausgabe: 5/6

#include <iostream> class Bruch { private: int _zaehler; int _nenner; public: Bruch(int zaehler, int nenner): _zaehler(zaehler), _nenner(nenner) { if (_nenner == 0) { throw std::invalid_argument("Nenner darf nicht 0 sein"); } } Bruch add(const Bruch& x) { return Bruch(_zaehler + x._zaehler, _nenner + x._nenner); } // Operator + überladen // const = keine Änderung der Objekte // Anpassung der Rechnung Bruch operator+(const Bruch& x) const { return Bruch(_zaehler * x._nenner + x._zaehler * _nenner, _nenner * x._nenner); } void print() { std::cout << _zaehler << "/" << _nenner << std::endl; } }; int main() { try { Bruch f1(1, 2); Bruch f2(1, 3); Bruch f3 = f1 + f2; f3.print(); } catch (const std::exception& e) { std::cout << e.what() << std::endl; } return 0; }

Aufgabe 2:

Erwartete Ausgabe: Marke: Tesla, Kilometerstand: 100

#include <iostream> #include <string> class Auto { private: std::string marke; int kilometerstand; protected: Auto(std::string m, int k): marke(m), kilometerstand(k) {} // protected -> public public: Auto(std::string m, int k): marke(m), kilometerstand(k) {} // Kilometerstand wird modifiziert void fahre(int km) const { void fahre(int km) { kilometerstand += km; } std::string getMarke() { return marke; } int getKilometerstand() { return kilometerstand; } }; int main() { Auto meinAuto("Tesla", 0); meinAuto.fahre(100); std::cout << "Marke: " << meinAuto.getMarke() << ", Kilometerstand: " << meinAuto.getKilometerstand() << std::endl; return 0; }

Tipps

Bei diesen Aufgaben kommen häufiger die selben Fehler vor. Daher lohnt es sich auf die folgenden Fehler zu konzentrieren:

  • Falscher Zugriffsmodifizierer (private anstatt protected oder public)
  • Konstruktorparameter falsch benannt
  • const wird falsch verwendet
    • Wenn eine Methode als const deklariert wird, bedeutet das, dass sie keine Variablen verändern kann.
  • Operatorüberladung (Wenn +, -, *, / als Rechnung verwendet werden und kein operator vorhanden ist)
  • Referenzen und Zeiger verwechselt
    • Wenn nur eine Kopie modifiziert werden soll, muss eine Referenz (&) verwendet werden.
  • Fehlendes public bei der Vererbung
  • this vergessen? Wenn z.B. in private und public die selbe Variable verwendet wird.
  • Falscher Pointer-Syntax (z.B. -> statt .)
    • -> wenn das Objekt ein Pointer ist
    • . wenn das Objekt ein Objekt ist
Last updated on