Nicolai M. Josuttis: solutions in time  OOP in C++: Errata

Objektorientiertes Programmieren in C++

Errata
2.9.2003

Dies ist das Errata für das Buch Objektorientiertes Programmieren in C++, 2. Auflage von Nicolai Josuttis. Es ist wie folgt organisiert:
- Es beginnt mit inhaltlichen Fehlern
- Es endet mit Schreibfehlern


Inhaltliche Fehler

Seite 94, Abschnitt 3.5.9, stl/ioiter1.cpp
Dieses Beispiel kann nicht auf allen Plattformen kompiliert werden, da ein Include-Statement für Stream-Iteratoren fehlt:
    #include <iterator>


Seite 122, Abschnitt 3.8.2
Die Bezeichnung feld für einen Zeiger auf eine Person ist irreführend und sollte z.B. durch so etwas wie ptr ersetzt werden.


Seite 151, Abschnitt 4.1.7
Der Bruch zweiDrittel muss natürlich mit Angabe des Namensbereiches erzeugt werden:
    Bsp::
Bruch ZweiDrittel(2,3);


Seite 165, Abschnitt 4.2.2
Die unten auf der Seite diskutierte Version der multiplikativen Zuweisung, darf das Return-Statement natürlich nicht enthalten:

void Bruch::operator *= (Bruch b)
{
    // "x *= y"  ==>  "x = x * y"
    *this = *this * b;
}


Seite 172, Abschnitt 4.2.6
Das erste Element von alleAngestellten muss der Variable p und nicht person zugewiesen werden:

Person p;
...
p = alleAngestellten[0];


Seite 173, Abschnitt 4.2.6
Das erste Element von alleAngestellten muss der Variable p und nicht person zugewiesen werden:

Person p;
...
p = alleAngestellten["nico"];


Seite 179, Abschnitt 4.3.2

Da Stringliterale den Datentyp const char* haben, muss f() auf Seite 179 jeweils wie folgt deklariert werden:

void f (const char* = "hallo");
...
void f (const char*= "hallo");


Seite 195, Abschnitt 4.4.4

Die Aussage am Ende von 4.4.4, dass temporäre Objekte grundsätzlich konstant sind stimmt so nicht. Sofern es sich um abstrakte Datentypen handelt, kann man vielmehr darauf noch modifizierende Operationen aufrufen. Nur temporäre Werte fundamentaler Datentypen sind konstant. Insofern könnte eine Deklaration des Rückgabewertes mit const sinnvoll sein.


Seite 200, Abschnitt 4.4.6
Beim Beispiel in der Mitte zur Zeigerkonstante fehlt ein Stern:

    *ip = 33;    // OK: i wird 33 zugewiesen

Seite 248, Abschnitt 4.7.2
In klassen/btest8.cpp sollte nach Einlesen des Zählers in z und des Nenners in n jeweils der Zustand des Eingabe-Streams cin geprüft werden und das Programm ggf. mit einer Fehlermeldung beendet werden.


Seite 253, Abschnitt 4.7.7
In klassen/bruch10.cpp fehlt bei der Deklaration von Funktion Bruch::scanFrom() die Qualifizierung std:: von istream
:

void Bruch::scanFrom(std::istream& strm)

Seite 255, Abschnitt 4.7.7
In klassen/bruch10.cpp in Funktion Bruch::scanFrom() fehlt der Else-Fall nach dem Test mit peek(). Ausserdem sollte bei einem Lesefehler eine entsprechende Exception ausgelöst werden. Korrekt lautet der entsprechende Ausschnitt dieser Funktion deshalb wie folgt:

// optionales Trennzeichen und Nenner ’/’ einlesen
if (strm.peek() == ’/’) {
    strm.get();
    strm >> n;
}
else {
    n = 1;
}


// Lesefehler?
if (! strm) {
    // Ausnahme mit Fehlerobjekt für Lesefehler auslösen
    throw Lesefehler();
}


Seite 256, Abschnitt 4.7.7
In klassen/btest10b.cpp sollte die Exception als Referenz abgefangen werden:

catch (const Bsp::Bruch::NennerIstNull&) {


Seite 258, Abschnitt 4.7.9
Im Konstruktor von Bsp::Fehler fehlen die Qualifizierung von string und der Doppelpunkt vor der Initialisierungsliste:

Fehler (const std::string& s) : message(s) {
}


Seiten 308-309, Abschnitt 5.3.3
In vererb/koord1.hpp fehlt viermal die Qualifizierung std:: von ostream.


Seite 346, Abschnitt 5.4.4
In der Abbildung 5.14 fehlt die in der Unterschrift angekündigte doppelte Ableitung:


Seite 368, Abschnitt 6.1.6
Die "naive" Implementierung von operator+ ist fehlerhaft, da die Korrektur der sum-Komponenten len und size fehlt. Korrekt muss es in der Mitte der Funktion wie folgt lauten:
    // ausreichend Speicherplatz anfordern
    delete [] sum.buffer;
    sum.len = s1.len + s2.len;
    sum.size = sum.len;
    sum.buffer = new char[sum.size];


Seiten 392-394, Abschnitt 6.2.7
Die Version von Operator [ ] für Konstanten liefert const char zurück. Das const ist unnötig und sollte entfernt werden.


Seite 406, Abschnitt 6.3.5
In dyna/fstest1.cpp muss statt <iostream.h> die Header-Datei <iostream> eingebunden werden.


Seiten 420 und 426, Abschnitte 6.5.1 und 6.5.2
In den Beispielen dyna/person3.hpp und dyna/person4.hpp ist der Vergleichsoperator falsch implementiert.
Statt
    return p1.vname == p1.vname && p2.nname == p2.nname;
muss es wie folgt lauten:
    return p1.vname == p2.vname && p1.nname == p2.nname;


Seite 428, Abschnitt 6.5.4
Die Deklaration
     void Klasse::Hilfsklasse::f()
muss durch
    void BspKlasse::Hilfsklasse::f()
ersetzt werden.


Seite 446, Abschnitt 7.3.3
Elementfunktionen von spezialisierten Klassentemplates beginnen nicht mit template<>. Somit sind alle Beispiele von tmpl/stack2.hpp auf den Seiten 446 und 447 entsprechend zu korrigieren.


Seite 568, Abschnitt 9.6.2
Im Beispiel zu Aufzählungstypen sind gleiche mehrere Dinge falsch:

Korrekt muss das Beispiel wie folgt lauten:

enum WertArt { Adresse, Zahl };


struct Eintrag {
    WertArt art;
    Wert    wert;
};


    Eintrag e;

    if (...) {
        e.art = Adresse;    // Adresse in Variante wert eintragen
        e.wert.adr = "hallo";
    }
    else {
        e.art = Zahl;       // Zahl in Variante wert eintragen
        e.wert.zahl = 42;
    }
    ...

    const char* t;
    int i;

    switch (e.art) {
      case Adresse:
        t = e.wert.adr;     // Adresse aus Variante wert auslesen
        break;
      case Zahl:
        i = e.wert.zahl;    // Zahl aus Variante wert auslesen
        ...
        break;
    }
}

Seite 569, Abschnitt 9.6.2
Der Aufzählungstyp Jahreszeiten sollte Jahreszeit genannt werden, da ein Wert dieses Typs schliesslich nur eine Jahreszeit repräsentiert.


Schreibfehler

Seite 60: s/einmal einmal/einmal/

Seite 60: s/foo() mit Linie über "fo"/foo()/

Seite 70: s/HMTL-Link/HTML-Link/

Seite 75: s:/cout << menge[i] << ' ';/std::cout << menge[i] << ' ';/

Seite 85: s/zwei Werte haben den Schlüssel 1/zwei Elemente haben den Schlüssel 5/

Seite 105: s/<cstdlib/<cstdlib>/

Seite 114: s/zugreift Statt/zugreift. Statt/

Seite 163: s/int Bruch::operator< (Bruch b)/bool Bruch::operator< (Bruch b)/

Seite 174: s/entspricht p[0]/entspricht p[0].k/

Seite 182: s/alle Symbole des Namensbereichs std sind global/alle Symbole des Namensbereichs Bsp sind global/

Seite 183: s/in f2() zweimal/in usingDeklarationen() zweimal/

Seite 199: s/alle Symbole des Namensbereichs std sind global/alle Symbole des Namensbereichs Bsp sind global/

Seite 200: s/ip = 33;/*ip = 33;/

Seite 201: s/Abschnitt 1/Abschnitt 3.4.4 auf Seite 72/

Seite 234: s/return a *= b;/return ergebnis *= b;/


Zurück zur Home-Page vom Buch