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 der Klasse einbinden
#include "bruch.hpp"
// **** BEGINN Namespace Bsp ********************************
namespace Bsp {
/* Default-Konstruktor, Konstruktor aus ganzer Zahl,
* Konstruktor aus Zähler und Nenner
* - Default für z: 0
* - Default für n: 1
*/
Bruch::Bruch (int z, int n)
{
/* Zähler und Nenner wie übergeben initialisieren
* - 0 als Nenner ist allerdings nicht erlaubt
* - ein negatives Vorzeichen des Nenners kommt in den Zähler
*/
if (n == 0) {
// neu: Ausnahme: Fehlerobjekt für 0 als Nenner auslösen
throw NennerIstNull();
}
if (n < 0) {
zaehler = -z;
nenner = -n;
}
else {
zaehler = z;
nenner = n;
}
}
/* Operator *=
*/
const Bruch& Bruch::operator *= (const Bruch& b)
{
// "x *= y" ==> "x = x * y"
*this = *this * b;
// Objekt (erster Operand) wird zurückgeliefert
return *this;
}
/* Operator <
* - globale Friend-Funktion
*/
bool operator < (const Bruch& a, const Bruch& b)
{
// da die Nenner nicht negativ sein können, reicht:
return a.zaehler * b.nenner < b.zaehler * a.nenner;
}
/* printOn
* - Bruch auf Stream strm ausgeben
*/
void Bruch::printOn (std::ostream& strm) const
{
strm << zaehler << '/' << nenner;
}
/* scanFrom
* - Bruch von Stream strm einlesen
*/
void Bruch::scanFrom (std::istream& strm)
{
int z, n;
// Zähler einlesen
strm >> z;
// optionales Trennzeichen '/' und Nenner einlesen
if (strm.peek() == '/') {
strm.get();
strm >> n;
}
else {
n = 1;
}
// Lesefehler?
if (! strm) {
return;
}
// Nenner == 0?
if (n == 0) {
// neu: Ausnahme mit Fehlerobjekt für 0 als Nenner auslösen
throw NennerIstNull();
}
/* OK, eingelesene Werte zuweisen
* - ein negatives Vorzeichen des Nenners kommt in den Zähler
*/
if (n < 0) {
zaehler = -z;
nenner = -n;
}
else {
zaehler = z;
nenner = n;
}
}
// Typumwandlung nach double
double Bruch::toDouble () const
{
// Quotient aus Zähler und Nenner zurückliefern
return double(zaehler)/double(nenner);
}
} // **** ENDE Namespace Bsp ********************************