http://www.pronix.de -> Bücher -> Bücher aus meiner Feder -> C++ von A bis Z -> Errata -> Errata (1.Auflage)

Errata (1.Auflage)

  • Seite 39.) Im Kapitel "Der Datentyp bool" fehlen beim Beispiel die abschließende Semikola: flag=true; flag=false;
  • Seite 39.) Im Kapitel "Der Datentyp char". Im letzten Satz muss es heißen -231 bis +231-1 anstatt 231..231-1
  • Seite 40.) Der Code-Abschnitt:

    1 #include <iostream>
    2
    3 using namespace std;
    4
    5 int main(void) {
    6    char ch1 = 'A';
    7    char ch2 = 'B';
    8    char ch3 = 68; //<- der Fehler, sollte 67 sein
    9    char ch4 = 69; // hier in dem Fall 68
    10   cout << ch1 << ch2 << ch3 << ch4;
    11   return 0;
    12 }

    soll die Ausgabe "ABCD" liefern, liefert allerdings "ABDE".
  • Seite 41.) Erster Satz muss es lauten '-9.223.372.036.854.755.808' anstatt '-9.223.372.036.854.755.807' (die letzte Ziffer stimmt nicht).
    Der selbe Fehler findet sich auf Seite 41 im dritten Absatz und in der Tabelle 1.3 ist der positive Zahlenbereich von int und long um 1 zu groß angegeben.
  • Seite 46.) Es fehlt das '?' in der Unterüberschrift d.h. es müsste laut dem einleitenden Satz dieses Kapitels 'Rechnen mit Gleitkommazahlen ?' heißen.
  • Seite 135.) Letzter Absatz. "..die Vergleichsoperatoren <, ><, !=, ==, <= und => erlaubt.", muss heißen "<, >, !=, ==, <= und >="
  • Seite 131 .) 3. Zeile von unten im Codebeispiel: Dort wurde bei int ptr ein "*" vergessen. Es müsste int * iptr heißen.
  • Seite 171 .) Dritte Zeile von unten: Das Wort "einem" streichen.
  • Seite 172 .) Dort steht: "Den alten Zeiger auf das Array auf das neue Array verweisen lassen"  -> "Den alten Zeiger des Array auf das neue Array verweisen lassen"
  • Seite 188 .) Erste Zeile: Ohne das Wort "also"
  • Seite 188.) Die dritte Möglichkeit ist falsch:

    int* a_ten_array3(int *buffer ) {
    int array[10] = {0};
    buffer = array;
    return buffer;
    }


    array[10] ist  lokal und wird nach Ende der Funktion zerstört. Buffer zeigt auf das erste Element. Dabei kann es passieren, dass C++ die Adressen (buffer +1)  neu vergibt.
  • Seite 192 .) (2.8) In der Mitte steht "jetztü" -> "jetzt"
  • Seite 211 .) 2. Absatz von unten letzter Satz: " ...,dessen Bedeutung jetzt allerdings von sekundär ist." -> ohne "von"
  • Seite 221 (2.Absatz): " Haben Sie zum Beispiel eine lokale und globale Variable mit dem Namen iwert, können Sie mit ::iwert auf die globale Variable und wie immer ..."
  • Seite 233 (nach dem Quellcode): "Wenn Sie Namensbereiche verschachteln, kann dies sehr verwirrend sein, ..."
  • Seite 247.) "Wollen Sie auch const-Bezeichner in verschiedenen Dateien verwenden, müssen Sie diese schon bei der Definition als extern definieren." -> Anstatt Defintion ist natürlich Deklaration gemeint.
  • Seite 249.) Überschrift 'Funktionsattribute': Es wird beim Funktionsattribut 'explicit' auf Kapitel 4 verwiesen, allerdings wird es dort nicht erwähnt (hier kommt noch ein Nachtrag von mir)
  • Seite 306.) vorletzter Absatz: "Beide Methoden legen auch ein lokales Objekt >>tmp<< von der Klasse Mensch." Hier fehlt am Ende das Wort "an".
  • Seite 307.) Erster Satz: "Ähnlich verläuft es ..." -> Es fehlt das Wort "es".
  • Seite 313.) obere Hälfte: "Mit dem Zeiger ...können Sie über alle Klassenmethoden zugreifen." -> anstatt "über" sollte hier "auf" stehen.
  • Seite 318.) Hinweisbox: "Natürlich muß erwähnt werden, dass der new-Handler...". Hier fehlt das Wort "der".
  • Seite 323.)  Kapitel 4.4.8:  "Objekt1 = Objekt2;" soll heißen "Objekt2 = Objekt1;"
  • Seite 324.) Folgende Deklaration vom Zuweisungsoperator ist falsch:

    Mensch& Mensch::operator=( const Mensch& person );

    Richtig ist:

    Mensch& operator=( const Mensch& person );
  • Seite 341.) Methode Mensch::erzeuge(...):  In dieser Methode sollte kein "++anzahlMensch;" stehen, da ja ein bereits existierendes Objekt der Klasse Mensch schon durch einen der Konstruktoren seinen Teil zur Bevölkerungsanzahl beigetragen hat. Bei jedem anschließenden Aufruf der Methode "erzeuge(...)" würde die Bevölkerungszahl fälschlicherweise weiter wachsen.
  • Seite 358.) Operatorüberladung "String operator+=(...)":  Am Ende der Operatorüberladung wird ein char* zurückgegeben (return buffer;), der Rückgabetyp ist aber ein "String". Also sollte es eigentlich "return *this;" lauten.
  • Seite 360.) In der Funktion myComplex operator+... gibt es folgende Zuweisung:

    tmp._real = val1._real += val2._real;

    Das funktioniert zwar, weil die Parameter als "Call by value" übergeben worden sind. Es ist aber eine überflüssige Zuweisung an die lokale Kopie der Variablen val1. Es ist eine mögliche Fehlerquelle, falls man die Parameter als Referenz übergibt. Man sollte den Operator "+=" durch den Operator "+" ersetzen.
  • Seite 390.) Konvertierfunktion "operator char*()":  Hier fehlt die return-Anweisung.
  • Seite 397.) vorletzter Absatz: "Somit hat ein Objekt vom Typ >>Buch<< hier sechs Elemente (drei eigene und drei geerbte)."
    Eigentlich sind es sieben Elemente (drei eigene und vier geerbte).
  • Seite 400.) Die Methode print() wird auf der Buch-CD im Ordner Kap_4_7_3 inline definiert. Deshalb ist die erste Zeile falsch:

    void
    Buch::print() {

    muß durch die Zeile

    void print() {

    ersetzt werden. Sonst erhält man vom Compiler eine Fehlermeldung.
  • Seite 403 .) Etwas unterhalb der Seitenmitte: "Abgesehen vom Zeitaufwand Neben der verlorenen Zeit...
  • Seite 418.) Bei der Ausgabe des Listings oben müssen die letzten beiden Ausgaben vertauscht werden.
  • Seite 439 (Quellcode Buch-CD): In main wird lliste.h includiert. Im Ordner befindet sich allerdings nur die Datei llist.h. Entweder die Datei umbenennen in lliste.h oder eben in main llist.h inkludieren.
  • Ab Seite 439 (Kap. 4.8.9) : Bei demBeispiel der objektorientierten Implementation der verketteten Listen am Ende des vierten Kapitels hat sich ein kleiner nebensächlicher Fehler eingeschlichen. In der Klasse 'AnfangsKnoten' wird zwar ein Objekt Endknoten (oder später indirekt ein Objekt AllgemeinerKnoten) erzeugt, doch werden diese bei Beendigung des Programms nicht korrekt zerstört, weil der Destruktor ~AnfangsKnoten() {} leer ist. Hier müsste es heißen: ~AnfangsKnoten(){ delete next; } damit die weiteren Knoten zerstört werden. Ebenso fehlt dies bei der  Implementierung dieses Beispiels bei den Templates am Anfang des fünften Kapitels. Hierzu ein Quellcode für das Template-Beispiel, bei dessen Ausführung außerdem alle Aufrufe der Konstruktoren und Destruktoren angezeigt werden (Vielen Dank an T. Meindl dafür).
  • Bei der Spezialsierung von Funktions-Templates ab Seite 480 bis 482 muss es in den jeweiligen Beispielen func_template4.cpp bis func_template7.cpp jeweils anstatt

       char* str1 = "ABCD";
       char* str2 = "AAAA";


    folgendermaßen heißen:

       const char* str1 = "ABCD";
       const char* str2 = "AAAA";


    Ist dies nicht der Fall, so funktioniert die Template Spezialisierung nicht, da diese nur für den Datentyp const char* ausgelegt ist und nicht für char*. Somit wird das normale Template aufgerufen, wobei es zu einem simplen Vergleich zweier Zeiger kommt.
  • Seite 473.) Erster Satz im Kapitel 5.1: Es fehlt das Wort "man". Es soll wohl heißen "...,dass man dieselbe Funktion..."
  • Seite 474.) Funktion BigNum(): Es wird kein Wert zurückgegeben, wenn beide Parameter gleich sind.
  • Seite 516.) Tab. 5.1: Operation X<=Y entspricht !(Y<X) und nicht fälschlicherweise !(Y>X)
  • Seite 518.) Tab. 5.2: Funktor negate<T> entspricht der Operation -x und nicht fälschlicherweise x.
  • Seite 524.) Kapitel "Stream-Iterator". Es fehlt der Hinweis, dass <fstream> als Headerdatei einzufügen ist.
  • Seite 524.) Mitte: "Dabei ist der ostream_iterator der AUSGABE-Iterator und der istream_iterator der EINGABE-Iterator." 
  • Seite 525.) Im Quellcode: "Listen-Iterator (bidirektional)": der Bezeichner vom Typ list<Daten>::iterator lautet "aktPos" und nicht "iter".
  • Seite 529.) Bei Laufzeitklassen: Die griechischen Sonderzeichen bei der Omega- und der Theta-Notation wurden nicht gedruckt.
  • Seite 531.) Tabelle 5.12: Methode iterator erase( iterator first, iterator last): "Alle Elemente HINTER dem zu löschenden ..."
  • Seite 538.) Tabelle 5.19: allocator_type get_allocator() (LEERZEICHEN zwischen Rückgabetyp und Name!)
  • Seite 563.) Tab. 5.36: Methode upper_bound(): ".., das GRÖSSER als s ist..." oder "..., das nicht kleiner GLEICH s ist..."
  • Seite 577.) Kapitel "Algorithmen mit Prädikat" ...und das einen booleschen Werten zurückgibt. -> soll heißen "Wert"
  • Seite 594.) Tabelle 5.50: Algorithmus reverse_copy(): "... in den Bereich [result,result + (last-first)) ..." (das MINUS nach result wird zum PLUS)
  • Seite 596.) Tabelle 5.51: "... und [first2, first2 + (last1-first1)) ..."
  • Seite 599.) Tabelle 5.52: "... Rückgabewert: result + (last1-first1)" (Die EINSER hinter last und first fehlen)
  • Seite 618.) "partial_sort_copy"    "Es werden nur sviele Elemente"   -> soll natürlich heißen "so viele"
  • Seite 624.) Tabelle 5.62: "... in den Bereich [result,result+(last1-first1)+(last2-first2)) ..." (In den Klammern müssen DIFFERENZEN stehen)
  • Seite 636.) Tabelle 5.66: "..., wenn die Elemente im Bereich [first1,last1) ..."
  • Seite 638.)  Bei der Beschreibung der Permutationen in der Infobox steht bei bool prev_permutation() "Führt die nächste Permutation der Elemente im Bereich [..] aus" was hier natürlich "vorige Permutation" heißen muss. Entsprechend steht bei bool next_permutation() "vorige Permutation" anstatt "nächste Permutation".
  • Seite 622.) Bei der Erklärung der throw-Anweisung zusammen mit Fehlerobjekten, muss es anstatt "case -1: myExceptionClass();" folgendermaßen heißen: "case -1: throw myExceptionClass();"
  • Seite 702.) vorletzte Zeile: "cout << "str  :" << str << endl;"
  • Seite 709.) oben: Funktion find_replace(): Da in der Bedingung der while-Schleife "pos + 1" verwendet wird, funktioniert die Ersetzung nicht, wenn der Suchbegriff gleich am Beginn steht. Ein "pos++" vor dem Ende der while-Schleife und in der while-Bedingung "pos" statt "pos + 1" löst das Problem.
  • Seite 709.) Mitte: das ausführbare Programm lautet "replString", nicht "replace"
  • Seite 713.) Tabelle 7.13: Bei der letzten Überladung von compare() auf dieser Seite fehlt der erste Parameter "size_type pos1".
  • Seite 788.) Mitte: Der Aufruf von print() sollte besser lauten: print( va, spalte );
    In dem Beispiel ist der Aufruf "print( va, zeile - 1 );" nur deshalb zufällig richtig, weil "spalte == zeile - 1" true ist.
  • Seite 790.) Mitte: Kommentar: "// valarray mit 27 Elementen ..." (der selbe kleine Fehler findet sich auf S.792, S.796 und S.798)
  • Seite 791.)  Zeile 4: "valarray<size_t> stride_val(stride_buf, 2);" (das "stride" fehlt)
  • Seite 800.) Tabelle 7.58: Funktion pow(): "Potenz zahl1zahl2" (das "hoch" fehlt)
  • Seite 802.) Tabelle 7.62: Makro isfinite(x): "Ist die Zahl eine endliche, ..." (nicht "unendliche")
  • Seite 804.) Tabelle 7.64: Eigenschaft min_exponent: "..., sodass die Gleitpunktzahl radixex noch darstellbar ist." (das "hoch" fehlt, ein ähnlicher Fehler findet sich bei den folgenden 3 Eigenschaften)
  • Seite 901.) Dort steht folgender Satz: "Schreibt man ein IPv6-Adresse vollständig aus, ergeben sich acht Doppelpunkte getrennt durch Hexadezimalzahlen; beispielsweise 2ffd:345:34b:33:432:e23:a:2". -> "...eine IPv6-Adresse..." und natürlich "sieben Doppelpunkte".
  • Seite 946.) Mitte: "... und auf Verbindungswünsche von Clients warten (Socket::listen())"
  • Seite 992.) Zweiter Absatz, zweiter Satz: "Die Behandlung von Ereignissen..." -> n vergessen.
  • Seite 1001.) Erster Absatz, letzte Satz: "Natürlich gibt es hier noch viele weitere Fensterklassen,..." -> n vergessen.
  • Seite 1020.) Tabelle 10.8: Stil wxYES_NO (das w am Anfang fehlt)
  • Seite 1029.) Erste Zeile: "Auch hierfür können wird ....." -> Ein d zuviel.
  • Seite 1033 bis 1037) Auf der Seite 1036 in den Methoden
    OnMenuFileAddPage und
    OnMenuFileInsertPage
    muß in der Zeile
     wxPanel *panel = new wxPanel(this, wxID_ANY); 
    statt des Parameters this der Parameter notebook stehen. Sonst werden keine neuen Pages erstellt.
  • Seite 1040.) unten: "... können Sie hierfür wxVSCROLL ..." (das V in wxVSCROLL fehlt)
  • Seite 1169.) Mitte: "... können Sie jetzt mit der Methode GetSelections ..." (das "s" am Ende fehlt, beim wxMultiChoiceDialog kanns ja mehr Auswahlen geben)
  • Seite 1173.) Mitte: Der Konstruktor muss heißen: "wxNumberEntryDialog"
  • Seite 1173.) unten: "... müssen Sie wieder ShowModal aufrufen ..." (nicht "ShowDialog", derselbe Fehler befindet sich auch auf S.1174 unten)
  • S.1174 unten: "style - Der Stil von wxTextEntryDialog ..." (nicht "wxNumberEntryDialog" )