OOP in C++: Errata |
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
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 Fehler (const std::string&
s) : message(s) {
Im Konstruktor von Bsp::Fehler fehlen die Qualifizierung von string und der
Doppelpunkt vor der Initialisierungsliste:
}
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.
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;/