Von C auf C++ umsteigen



  • Hallo!

    Ich programmiere seit längerer Zeit C - bisher nur auf textbasierter Ebene - und hatte vor mich mit der GUI-Programmierung zu beschäftigen. Da ich darauf hingewiesen wurde, dass sich die objektorientierten Sprachen dafür besser eignen als die prozedualen, habe ich mich dazu entschlossen, einen Umstieg auf C++ zu wagen. Ich bin mir schon bewusst, dass ich mir einen schlechten Stil angewöhnen kann, indem ich eine Mischung von C und C++ programmiere. Beim Umstieg werde ich deswegen stark darauf achten, beide Sprachen gut von einander zu unterscheiden.

    Meine erste Frage ist: In welchen Bereichen konkret macht sich dieser schlechte Stil bemerkbar, damit ich weiß, worauf ich besonders achten sollte?
    (Vermischung von objektorientierter und prozedualer Programmierung, Verwendung alter Funktionen etc. ?)

    Die zweite Frage an euch wäre, ob ich mir ein Buch besorgen sollte, dass mit der Programmierung von Null anfängt, oder eines, dass sich speziell an C Programmierer richtet? Sind solche Bücher, die speziell für Umsteiger gedacht sind, überhaupt empfehlenswert, da sie vielleicht Einzelheiten in der Programmiersprache vorenthalten oder lohnen sich gerade solche Bücher, da sie den Unterschied zur anderen Sprache sehr deutlich machen?

    Zwei Bücher habe ich bisher gefunden:

    C++. Lernen und professionell anwenden - von Peter Prinz und Ulla Kirch-Prinz
    C++ für C-Programmierer - ebenfalls von Peter Prinz und Ulla Kirch-Prinz

    Von dem oberen Buch habe ich bisher nur Empfehlungen gehört. Das andere kennen anscheinend ziemlich wenige. Habt ihr vielleicht Erfahrungen mit einem der beiden Bücher?

    MfG
    gollo



  • kauf dir einfach "Herbert Schildt - c++ die professionelle Referenz" dort wirst du auf alle änderungen hingewiesen. sogut wie alles wird kurz behandelt und am ende findet man eine bibo über sehr viele c und c++ funktionen.

    also wenn du ein mensch bist der eine lange beschreibung benötigt würd ich erstmal das buch irgendwo ausleiehen, jedoch wenn du schnell verstehst und nicht viel wiederholung brauchst ist das buch perfekt



  • "Thinking in C++" ist IMO auch sehr gut fuer C Umsteiger geeignet. Vom Anfang an wird das Denken in Objekten fokusiert. Und in Volume 2 werden dann besonders solche Dinge behandelt, von denen C++ Einsteiger-Buecher nie sprechen: Weiterfuehrende Template-Methoden, die STL, ... Der grosse Vorteil vom Buch ist, dass es gratis im Internet verfuegbar ist.



  • Fehler die C-Programmierer in C++ machen gibts viele. Aber auch hier ist es so, das selbst C++-Buchautoren noch selbst C-Altlasten mitschleppen, weil sie selber mal C-COder waren. 😡 Man sollte z.B. in C++ sich Pointer abgewöhnen, bzw. deren Anteil lässt sich ggü. C auf bis zu 99% der Fälle vermeiden. Weiterhin gibt es für jede C-Lösung eine C++-Lösung im Bereich der Standard-Library.

    Man sollte sich beim Umstieges eines klar machen: C++ kann nur deshalb C, damit man alte C-Programme leichter nach C++ migrieren kann. C in C++ ist nicht deshalb drin, damit man weiter C programmiert.

    Deshalb würde ich das Buch von Breymann wärmstens empfehlen:
    http://www.hanser.de/buch.asp?isbn=3-446-40253-5&area=Computer
    Ist für den Seitenumfang ein günstiges Buch. Der Autor versteht es meiner Meinung nach, sauberes C++ zu vermitteln. Habe mir selber immer gesagt "Wenn ich mal ein C++ Buch schreibe, machen ich es so und so, weil das Buch gibts nicht". Naja, Breymanns Buch hab ich dann halt doch irgendwann mal entdeckt. Kann nur sagen: 👍





  • Artchi schrieb:

    Thinking in C++ Vol. 1: http://www.planetpdf.com/codecuts/pdfs/eckel/TIC2Vone.zip
    Vol. 2: http://www.planetpdf.com/codecuts/pdfs/eckel/TIC2Vtwo.zip

    oder ganz einfach von der offiziellen Seite: http://www.mindviewinc.com/ 😉



  • Artchi schrieb:

    Man sollte z.B. in C++ sich Pointer abgewöhnen

    ??? das hab ich ja noch nie gehoert - ich selber arbeite auch viel mit referenzen, aber pointer will ich nicht vermissen wollen - ist mir neu das pointer nur von C geerbt ist und nicht zu cpp gehoert



  • Mr Evil schrieb:

    Artchi schrieb:

    Man sollte z.B. in C++ sich Pointer abgewöhnen

    ??? das hab ich ja noch nie gehoert - ich selber arbeite auch viel mit referenzen, aber pointer will ich nicht vermissen wollen - ist mir neu das pointer nur von C geerbt ist und nicht zu cpp gehoert

    Da kann ich aber Artchi nur voll zustimmen. Er hat ja nicht gesagt, daß Zeiger gar nicht verwendet werden sollen. Ich will auch nicht auf Zeiger verzichten. Die haben ihre Daseinsberechtigung.

    In C++ gibt es allerdings viele Features, die die Notwendigkeit der Verwendung von Zeigern oft überflüssig machen. Das fängt schon bei Strings an. In C verwendet man char*, in C++ sollte man std::string verwenden. Gerade ehemalige C-Programmierer verwenden häufig char* und begeben sich auf den dornigen Pfad der Buffer-overflows und Memory-leaks.

    Auch die Containerklassen aus der Stl helfen, dynamisch Daten zu halten, ohne einen eizigen Zeiger zu verwenden.

    Wenn man dann doch Zeiger benötigt, dann sollte man Smart-pointer verwenden.

    Tntnet



  • Mr Evil schrieb:

    Artchi schrieb:

    Man sollte z.B. in C++ sich Pointer abgewöhnen

    ??? das hab ich ja noch nie gehoert - ich selber arbeite auch viel mit referenzen, aber pointer will ich nicht vermissen wollen - ist mir neu das pointer nur von C geerbt ist und nicht zu cpp gehoert

    Hi,

    ich vermute, es geht um den tw. exzessiven Gebrauch von Pointern in C für Dinge, die man in C++ besser/anders lösen kann: strings, Container, Referenzen, Iteratoren, ...
    Ich zumindestens habe den Eindruck, dass viele Programmierer eher dazu neigen, ihre bewährten Techniken auch in eine neue Sprache "zu retten", als sich erstmal mit deren neuen Features, Techniken, Denkweisen zu beschäftigen.
    Bei Ex-C-lern sieht man dann eben an vielen Stellen Pointer, wo sie nicht nötig wären .... und da mal ein "Stoppschild" ("Zeiger abgewöhnen" für Cler oder "no new" für Javaisten) einzubauen, kann pädagogisch durchaus sinnvoll sein. 😉

    EDIT: Ach ja .. war wieder mal zu langsam.

    Gruß,

    Simon2.



  • Mr Evil schrieb:

    Artchi schrieb:

    Man sollte z.B. in C++ sich Pointer abgewöhnen

    ??? das hab ich ja noch nie gehoert - ich selber arbeite auch viel mit referenzen, aber pointer will ich nicht vermissen wollen - ist mir neu das pointer nur von C geerbt ist und nicht zu cpp gehoert

    Bitte nicht den halben Satz lesen und zittieren. Dann sollte dir klar werden, was ich geschrieben habe. 🙄



  • Eine der Schwiergkeiten beim Umstieg ist die Tatsache, daß der Compiler sowohl C++ als auch C kann und von daher keinerleit Warnung/Hilfe kommt wenn man hier wild die Sprachen vermischt.

    Ein daher nicht ganz abwegiger Gedanke ist es, für eine gewisse Zeit zumindest auf eine rein Objektorentierte Sprache zu wechseln. Auch wenn ich als alt-eingesessener C-programmierer (sprich 25 Jahre) und eingefleischter C++ Programmerer (sprich 12 Jahre) immer eine Grundabneigung gegen java und C# hatte muß ich rückblicken einfach zugeben, daß gerade mein Ausflug nach C# (beruflich bedingt) mir am meisten gegolfen hat um die prozeduralen Altlasten in meine Stil zu erkennen und zu überwinden.

    Und es war ein Java Buch (Thinking Java, Bruce Eckel) daß mir sehr gehalfen hat Objektorientiert zu arbeiten.

    Für einen c-programmieer ist auch das Buch "The Design and Evolution of C++" sicher auch sehr Hilfreich (Von keinem andern als Stroustrup selbst) weil er darin beschreibt, wie und vor allem warum er C++ entwicklet hat.



  • Hi,

    auch wenn ich dem Gedanken prinzipiell zustimme, stört mich doch eines:

    nags schrieb:

    ...die prozeduralen Altlasten in meine Stil zu erkennen und zu überwinden....

    Saubere C++-Programmierung besteht nicht automatisch rein aus OO. Wer z.B. eine Kryptolib schreibt, für den wäre ein OO-Gerüst an vielen Stellen wenig hilfreich (vorsichtig ausgedrückt). Insgesamt ist ein "OO-auf-Teufel-komm-raus" keine sinnvolle Herangehensweise.

    Wichtiger finde ich da, dass man die Konzepte von Streams, Containern/Iteratoren, templates, Polymorphie, Overloading, Kapselung/Zugriffsbeschränkung, Vererbung, .... "lernt".
    Damit meine ich, nicht nur das "Kennen", sondern vA die Unterscheidung, wann es sich lohnt, welches Konzept einzusetzen ... und dann natürlich, wie man es anwendet.

    Ich will nicht bestreiten, dass es zu Übungszwecken didaktisch sinnvoll sein kann, erstmal bei allem zu versuchen, es in Klassen zu formulieren - und vielleicht hilft es dabei, wenn eine Sprache einen zur Einführung von Objekten "zwingt" (wobei man in Java ebenso prozedural programmieren kann, wie in C 😉 ).
    Aber es gehört eben auch dazu, zu erkennen, wann es sinnvoller ist, prozedural zu programmieren.

    Gruß,

    Simon2.



  • Wenn ich die letzten Beiträge, die speziell meine erste Frage betreffen, zusammenfassen darf, dann sollte ich beim Umstieg also besonders folgende Punkte beachten:

    - den neuen Stellenwert der Zeiger; sie werden seltener gebraucht als in C

    - alle veralteten C-Komponenten vermeiden, also char-Arrays durch C++ Strings ersetzen, keine Funktionen aus der C Standard Bibliothek verwenden etc.

    - der wichtigste Punkt: Objektorientiert programmieren. Ich werde vor allem bei diesem Punkt sehr viel Wert darauf legen, das Prinzip zu verstehen und das Gefühl dafür zu bekommen, richtig objektorientiert zu programmieren.

    Zu meiner zweiten Frage:
    Ich habe ein wenig nach dem Buch von Breymann gegoogelt und viele Empfehlungen bekommen. Allerdings gab es einige Meinungen, dass das Buch etwas zu kompliziert sei. Jetzt stehe ich zwischen der Entscheidung, ob ich mir das Buch "C++ lernen und professionell anwenden (Ulla Kirch-Prinz, Peter Prinz)" oder das Buch "C++" von Breymann kaufen soll.



  • Simon2 schrieb:

    Hi,

    auch wenn ich dem Gedanken prinzipiell zustimme, stört mich doch eines:

    nags schrieb:

    ...die prozeduralen Altlasten in meine Stil zu erkennen und zu überwinden....

    Saubere C++-Programmierung besteht nicht automatisch rein aus OO. Wer z.B. eine Kryptolib schreibt, für den wäre ein OO-Gerüst an vielen Stellen wenig hilfreich (vorsichtig ausgedrückt). Insgesamt ist ein "OO-auf-Teufel-komm-raus" keine sinnvolle Herangehensweise.

    Stimme Dir da voll zu Simon.

    Ich bezog die Altlasten auf meine Denkstrukturen. Ich ertappe mich immer wieder dabei wie ich bei einer Problemlösung zuerst etwas prozedurales vor Augen habe und erst an zweiter Stelle dann dei OO-variante sehe, einfach weil das prozedurale Proggen so tief verwurzelt ist (1. Sprache: Assembler, 2. Sprache C... das sitzt tief)

    gollo schrieb:

    - den neuen Stellenwert der Zeiger; sie werden seltener gebraucht als in C

    Dem würde ich nicht zustimmen. Es stimmt schon das man in C++ weniger Zeiger braucht als in C (naja, in C gibts ja eigendlich auch nur Zeiger 😉 ). Ich würde aber nicht soweit gehen die Menge der Zeiger als Maßwet für die Qualität eines C++ programmes zu betrachten.

    gollo schrieb:

    - alle veralteten C-Komponenten vermeiden, also char-Arrays durch C++ Strings ersetzen, keine Funktionen aus der C Standard Bibliothek verwenden etc.

    Der Grundgedanke von OOP ist es, daten und zu Ihnen gehörende Funktionalität in einer Klasse zu kapseln. Betrachtest Du jetzt aber char-arrays und den Umgang mit diesen (strcpy, strcmp usw), dann sind hier Daten und Funktionen getrent voneinander, also das genaue Gegenteil des OOP.

    btw, string ist letzten Endes auch nichts anderes als ein char-arrays, nur da alles was zur Verwaltung des char-arrays notwendig ist in der String-Klasse "versteckt" ist.

    gollo schrieb:

    - der wichtigste Punkt: Objektorientiert programmieren. Ich werde vor allem bei diesem Punkt sehr viel Wert darauf legen, das Prinzip zu verstehen und das Gefühl dafür zu bekommen, richtig objektorientiert zu programmieren.

    Jup. wichtig ist zu verstehen, daß allein die Benutzung von keywords wie "class" noch lange kein OOP ausmacht 😉 wie Simon sagte, man kann selbst in java komplett prozedural proggen... Es ist eine Kopfsache und das macht es halt so schwer...



  • gollo schrieb:

    Ich habe ein wenig nach dem Buch von Breymann gegoogelt und viele Empfehlungen bekommen. Allerdings gab es einige Meinungen, dass das Buch etwas zu kompliziert sei. Jetzt stehe ich zwischen der Entscheidung, ob ich mir das Buch "C++ lernen und professionell anwenden (Ulla Kirch-Prinz, Peter Prinz)" oder das Buch "C++" von Breymann kaufen soll.

    Naja, ich glaube nicht das Breymanns Buch zu kompliziert ist. Es ist ein reines Einsteigerbuch und ich habe es mal im Buchladen überflogen und auch die Probekapitel gelesen. Ich finde es ist sehr gut und verständlich geschrieben. Noch einfacher geht es nicht. Irgendwo muß er ja auch mal bei über 700 Seiten einen höheren Level anstreben. Soll er 700 Seiten nur HelloWorld behandeln? Und es ist auch in der Programmierung ganz normal, das man C++ nicht nach einer Woche komplett versteht. C++ ist halt umfangreich. Das kann aber kein Buch verhindern. 😉


Anmelden zum Antworten