vererb/kbruch3.cpp

Das folgende Code-Beispiel stammt aus dem Buch
Objektorientiertes Programmieren in C++ - Ein Tutorial für Ein- und Umsteiger
von Nicolai Josuttis, Addison-Wesley München, 2001
© Copyright Nicolai Josuttis 2001


// Headerdatei für min() und abs()
#include <algorithm>
#include <cstdlib>

// Headerdatei der eigenen Klasse einbinden
#include "kbruch.hpp"

// **** BEGINN Namespace Bsp ********************************
namespace Bsp {

/* ggt()
 * - größter gemeinsamer Teiler von Zähler und Nenner
 */
unsigned KBruch::ggt () const
{
    if (zaehler == 0) {
        return nenner;
    }

    /* Größte Zahl ermitteln, die sowohl Zähler als auch
     * Nenner ohne Rest teilt
     */
    unsigned teiler = std::min(std::abs(zaehler),nenner);
    while (zaehler % teiler != 0  ||  nenner % teiler != 0) {
        teiler--;
    }
    return teiler;
}

/* kuerzen()
 */
void KBruch::kuerzen ()
{
    // falls kürzbar, Zähler und Nenner durch GGT teilen
    if (kuerzbar) {
        int teiler = ggt();

        zaehler /= teiler;
        nenner  /= teiler;

        kuerzbar = false;       // damit nicht mehr kürzbar
    }
}

/* Operator *=
 * - zum Überschreiben mit Typen der Basisklasse neu implementiert
 */
const KBruch& KBruch::operator*= (const Bruch& b)
{
    /* Implementierung der Basisklasse aufrufen
     * - auf nichtöffentliche Komponenten von b besteht kein Zugriff
     */
    Bruch::operator*= (b);

    // weiterhin gekürzt ?
    if (!kuerzbar) {
        kuerzbar = (ggt() > 1);
    }

    return  *this;
}

/* scanFrom()
 */
void KBruch::scanFrom (std::istream& strm)
{
    Bruch::scanFrom (strm);   // scanFrom() der Basisklasse aufrufen

    kuerzbar = (ggt() > 1);   // Kürzbarkeit testen
}

// **** ENDE Namespace Bsp ********************************