Wie lernt man gutes C++ zu schreiben?



  • Danke erst einmal. Ich habe schon einiges über C++ gelesen. Auch darüber dass man es sehr sauber und "gut" programmieren kann, aber auch dass man da totalen Mist verzapfen kann. Wenn ich nach einem Buch wie "Eine Tour durch C++" vorgehe, ist also die Chance "gutes" C++ zu lernen hoch? Klar lern man im Edeffekt durch machen, machen, machen, aber woher weiß ich dass das was ich mache "gutes" C++ ist?



  • GoodCpp schrieb:

    Danke erst einmal. Ich habe schon einiges über C++ gelesen. Auch darüber dass man es sehr sauber und "gut" programmieren kann, aber auch dass man da totalen Mist verzapfen kann.

    Und viele programmieren sehr sauber aber noch mehr verzapfen totalen Mist. Die vielen, die unsauber rumstümpern, die haben mit einem Kackbuch angefangen und kein gutes je gesehen.

    GoodCpp schrieb:

    Wenn ich nach einem Buch wie "Eine Tour durch C++" vorgehe, ist also die Chance "gutes" C++ zu lernen hoch?

    Sie ist gleich Null.
    Wirst ja auch nicht durch einem geführten Spaziergang durch den Wald zu einem Förster.
    Das Buch schützt dich nicht davor, Username von string erben lassen zu wollen

    GoodCpp schrieb:

    Klar lern man im Edeffekt durch machen, machen, machen, aber woher weiß ich dass das was ich mache "gutes" C++ ist?

    Das steht in guten C++-Büchern natürlich.

    Zu dem Buch: Struppi hat einen sehr guten Ruf (aber als gnadenloser C++-Auskenner und Stratege, nicht als Didakt). Der Hanser-Verlag hat keinen schlechten Ruf (aber dann bleib doch doch bei Hanser und nimm den Breymann). Wobei, wenn ich mir 3446420215 ansehe, dann weiß ich wieder, weshalb Hanser keinen guten Ruf hat.

    https://www.c-plusplus.net/forum/251551-full



  • Danke für deine ausführliche Antwort. Eins ist mir dabei aber nicht klar. Ich kann also durch das Buch "Eine Tour durch C++" nicht gutes C++ lernen. Du empfiehlst aber ein Buch von Stuppi zum Lernen von gutem C++. Das Buch "Eine Tour durch C++" ist aber auch von Struppi und stellt einen erweiterten Auszug aus seinem Standardwerk dar. Mit dem einem Buch von Stuppi lerne ich also gut und mit dem anderen weniger gut??? Könntest du bitte meinen Knoten im Kopf in dem Bezug lösen?



  • Gutes C++ lernst du, in dem du regelmäßig in Foren liest, was schlechtes C++ ist. :schland:



  • GoodCpp schrieb:

    Danke für deine ausführliche Antwort. Eins ist mir dabei aber nicht klar. Ich kann also durch das Buch "Eine Tour durch C++" nicht gutes C++ lernen. Du empfiehlst aber ein Buch von Stuppi zum Lernen von gutem C++. Das Buch "Eine Tour durch C++" ist aber auch von Struppi und stellt einen erweiterten Auszug aus seinem Standardwerk dar. Mit dem einem Buch von Stuppi lerne ich also gut und mit dem anderen weniger gut??? Könntest du bitte meinen Knoten im Kopf in dem Bezug lösen?

    Gutes Deutsch lernst Du nicht aus einem Wörterbuch. Da kannste nur die Wörter lernen. Aber hast dann doch noch keine Ahnung, wie Du Sätze baust und gar keine Ahnung, wie Du Bedeutung in die Sätze legst. Und bist extrem weit weg davon, einen Schimmer einer Ahnung davon zu haben, was gutes Deutsch ist.



  • Ok, das wäre noch eine Quelle des guten Lernens. ABER, es wurde auch gesagt das einige C++ gut können und viele eben nicht. Nun wird sich dieses Verhältnis auch sicherlich auf die Forenmitglieder übertragen lassen. Woran erkenne ich nun wer hier Ahnung hat und wer nicht?

    Gibt es nicht irgendeinen roten Faden der mich zu gutem C++ führt? Wenn es den nicht gibt, wie soll dann der Nachwuchs gutes C++ lernen?



  • Gutes Deutsch kann man schon aus einem Buch lernen, denke ich. Es gibt ja nicht nur Wörterbücher, genau wie es bei C++ sicherlich nicht nur Referenzen der Sprache gibt. Es muss doch auch irgendwo niedergeschrieben sein, was ich mit den Möglichkeiten von C++ anfangen kann und wie ich es so nutze das es "guter" C++-Code wird.



  • GoodCpp schrieb:

    Du empfiehlst aber ein Buch von Stuppi zum Lernen von gutem C++.

    Welches Buch von Struppi empfehle ich zum Lernen von gutem C++?



  • GoodCpp schrieb:

    Nun wird sich dieses Verhältnis auch sicherlich auf die Forenmitglieder übertragen lassen. Woran erkenne ich nun wer hier Ahnung hat und wer nicht?

    Wie in der Politik. Machs wie alle und höre auf den, der am lautesten schreit, oder begutachte die öfters mitangegebenen Begründungen und stufe die Aktöre mit der Zeit ein.

    GoodCpp schrieb:

    Gibt es nicht irgendeinen roten Faden der mich zu gutem C++ führt? Wenn es den nicht gibt, wie soll dann der Nachwuchs gutes C++ lernen?

    Nee, einen Königsweg gibt es nur für die Geometrie.



  • Ich sagte "Gutes Deutsch lernt man nicht aus einem Wörterbuch" und Du widersprichst mit "Gutes Deutsch kann man schon aus einem Buch lernen".
    Da stimmt doch was nicht.

    "Eine Tour durch C++" ist dabei das Wörterbuch. Es ist kein Lehrbuch.



  • GoodCpp schrieb:

    Es muss doch auch irgendwo niedergeschrieben sein, was ich mit den Möglichkeiten von C++ anfangen kann und wie ich es so nutze das es "guter" C++-Code wird.

    Dazu schickte ich Dir den Link https://www.c-plusplus.net/forum/251551-full
    Bitte verfolge meine Links, dazu gebe ich sie an.



  • Ok danke, ich werde mir die Bücher besorgen.



  • Noch eine Frage an diejenigen die schon eine Weile auf dieser Reise sind. Wie lange braucht es im Durchschnitt um gutes C++ zu lernen?



  • GoodCpp schrieb:

    Noch eine Frage an diejenigen die schon eine Weile auf dieser Reise sind. Wie lange braucht es im Durchschnitt um gutes C++ zu lernen?

    Ein Leben lang.

    Nach ein paar Jahren bist du vielleicht kein Grünschnabel mehr ...



  • Ist das wirklich so heftig? Wenn dem so wäre, dürften nur extrem wenige gutes C++ beherrschen und das wäre ein Desaster für so ziemlich jedes C++-Projekt da draußen. Also jetzt mal im ernst. Wenn jemand schon programmieren gelernt hat, welche Zeit sollte er mindestens einplanen um guten C++ zu beherrschen?



  • GoodCpp schrieb:

    Ist das wirklich so heftig? Wenn dem so wäre, dürften nur extrem wenige gutes C++ beherrschen und das wäre ein Desaster für so ziemlich jedes C++-Projekt da draußen. Also jetzt mal im ernst. Wenn jemand schon programmieren gelernt hat, welche Zeit sollte er mindestens einplanen um guten C++ zu beherrschen?

    Mal meine Geschichte:

    Ich habe C gelernt. Heftig C gelernt. Die letzten 8 Jahre. C ist weniger komplex als C++, aber ein paar Sachen hast du in beiden Sprachen halt so drin.

    Ich finde noch heute Sachen in meinen Codes von vor 9 Monaten, wo ich mich frage, was zum Teufel ich mir dabei gedacht habe. Vielleicht bin ich in der Hinsicht aber auch nur Nazi.

    void foo()
    {
        if(bla)
        {
            /*Code*/
            /*Mehr Code*/
            /*Ganz viel Code*/
            /*Coooooooooode*/
        }
        else
        {
            return;
        }
    }
    

    Würde ich so einen Code bei einem Audit sehen, würde ich fragen, welcher Suffkopp das so geschrieben hat.

    void foo(void)
    {
        if(!bla)
            goto END;
    
        /*Code*/
        /*Mehr Code*/
        /*Ganz viel Code*/
        /*Coooooooooode*/
    
    END:
        return;
    }
    

    Warum das Label und das goto ? Weil die Erfahrung zeigt, dass man den Code irgendwann noch mal anfasst und dann Ressourcen reserviert. Aber aufgerufene Funktionen können fehlschlagen. Dann muss man die Ressourcen wieder freigeben. Im jeden Fehlercheck-Block wieder Code zu haben, der sich um das Freigeben von Ressourcen zu exakt diesem Punkt in der Ausführung kümmert, kann leicht 300 Zeilen ausmachen. Gute Programmierer schreiben den Code so hin, dass der kritische Pfad beieinander liegt, und dass es keine Redundanzen gibt. Oh, nicht im Kompiliat, sondern auf Quellcode-Ebene.

    Sie sagen dir, goto ist böse. Und das stimmt auch für einfache Schleifenkonstrukte. Aber lokal auf Funktionen begrenzt, um tatsächlich Code einzusparen, sind sie das nützlichste, was mir bisher unter die Finger gekommen ist. Jetzt kommt es aber: viele Programmierer denken darüber nicht nach. Ja klar, wenn man dir das einmal im Forum neutral erklärt, dann ergibt das natürlich Sinn, so viele Pfade wie möglich zusammenzufassen. Aber erklär das mal einem Programmierer, der neben dir sitzt, für LOCs bezahlt wird und für Bugs abgestraft. Den interessiert nur, ob der Code fehlerfrei ist. Ob er lesbar ist? Nö, dafür wird der Typ von extern geholt, der darf sich dann durch tausende LOCs wühlen.

    Wenn du ein lustiges Wochenende verbringen willst, schau dir einfach mal die Quellcodes von ein paar OSS C/C++-Projekten an. Muss nix großes wie PCSX2 sein (über die kann ich nur stänkern, bis die Schwarte kracht). Wie das überhaupt eingecheckt werden konnte, frage ich mich bis heute ... ach nee, tue ich nicht, ich weiß es ja. Stichwort Heartbleed. Da hat jemand, der keine Ahnung von Protokolldesign hatte, für seine Forschungsarbeit an einem Protokoll gearbeitet. Weiter ins Detail möchte ich nicht gehen, aber das eine: das hat er dann OpenSSL angeboten. Eine Stunde nach Mitternacht. Am Neujahrstag. Die Leute schauen sie das nicht wirklich an, das wird nur schnell-schnell eingepflegt.

    Fazit: wenn du wirklich gut in einer Sprache werden willst, rechne ungefähr so viel Zeit ein, wie du zum ordentlichen Lernen einer menschlichen Sprache verbringen würdest - auch wenn diese aufgrund der Ausspracheregeln, die dir beim Programmieren fehlen, einfacher ist.

    Und das sage ich dir, der C macht statt C++. C++ ist noch mal eine Ecke komplexer.



  • Au Backe, das klingt nach USA. Jeder kann eine scharfe Waffe(C++) tragen und wenn jeder sich an Regeln hält "kann" das auch gut gehen.

    Wie kann man es hinkriegen dass jeder in ein paar Monaten C++ so gut beherrscht, dass er keinen Bockmist baut? Kann nicht der Compiler einfach bestimmte Sachen nicht erlauben, die extrem gefährlich sind? Oder kann man nicht wie wohl bei Rust bestimmte Teile als unsafe bestimmen, damit man sich im Zweifelsfall nur durch diese Bereiche hangeln muss?

    Die neuen C++ Standards sollen ja viele Verbesserungen erfahren haben. Ich selbst kann das alles nicht beurteilen, sondern ich versuche nur meine Weg zu gutem C++ mit Hilfe des Forums hier abzustecken. Das scheint gar nicht so einfach zu sein. Klar könnte ich einfach einen andere Programmiersprache wählen, aber ich bin halt sehr an der Königsklasse interessiert. Die Sprache soll mich unterstützen und mich nicht aufhalten. Da C++ aber sooo viele Möglichkeiten bietet empfinde ich es als sehr schwer die für mich wirklich notwendigen Sachen raus zu filtern.



  • @dachschaden

    sorry aber das ist totaler Quark den du hier schreibst - deine "goto END" hilft dir nur dein nicht sauber in Funktionen zerlegten Code wartbar/überschaubar zu halten - und wenn viele andere in vielen Funktionen deinem Beispiel folgen ist das definitiv eine Wartungshölle - und das ist alles andere als OK

    und C++ ist nicht wirklich komplexer als C - ausser RAII (was hier den goto voellig unnlötig macht) muss man ja nicht komplett alles was eine Sprache bietet auch (aus)nutzen



  • Gast3 schrieb:

    sorry aber das ist totaler Quark den du hier schreibst - deine "goto END" hilft dir nur dein nicht sauber in Funktionen zerlegten Code wartbar/überschaubar zu halten - und wenn viele andere in vielen Funktionen deinem Beispiel folgen ist das definitiv eine Wartungshölle - und das ist alles andere als OK

    Ich habe hier eine Funktion, die auf Windows und Linux Verzeichnisse rekursiv durchgeht, und dabei noch ein bisschen Speichermanagement macht. Allein in der Initialisierungsfunktion (die dann die rekursive Funktion ausführt) habe ich 8 Fehlerpfade, für die unterschiedliche Ressourcen freigegeben werden müssen. Diese Funktion hatte ohne diese Fehlerlabels 50 Zeilen mehr Code, der komplett, aber auch komplett redundant ist. Das Einzige, worauf man achten muss, ist die Benamung der Labels,

    Eine Wartungshölle sieht anders aus. Aber vielleicht hast du auch noch nie guten Code gesehen. Ich habe auf jeden Fall genug schlechten Code gesehen, um solchen zu erkennen.

    Gast3 schrieb:

    und C++ ist nicht wirklich komplexer als C - ausser RAII (was hier den goto voellig unnlötig macht) muss man ja nicht komplett alles was eine Sprache bietet auch (aus)nutzen

    Sag an. 🙄 Deswegen auch vorher der Disclaimer, dass ich von der C-Seite komme. Weil, C hat halt kein automatisches RAII (Thank Fu​ck), und ich persönlich halte es für leicht unnötig - aber das habe ich bereits oft genug hier geschrieben.

    Meine Beispiele für C waren genau das - Beispiele für C. In C++, da bin ich mir sicher, gibt es mitunter auch zusätzliche Szenarien, auf die man aufpassen sollte. Abgesehen da, wo Sprachfeatures das halt automatisch machen und man dann ctor- und dtor-Aufrufe mit sich rumschleppt.

    EDIT: Und bevor mir deswegen wieder einer vor den Mund fährt - nein, ich sage nicht, ctor und dtor sind automatisch langsam. Ich sage, ich habe dadurch zwei Funktionsaufrufe, die sehr langsam sein können, die ich nicht kontrollieren kann, und bei denen ich (als Nutzer, nicht als jemand, der am Code arbeitet) nicht auf Anhieb sagen kann, ob die Operation teuer ist oder nicht, ohne vorher in den Source zu schauen. Bei C habe ich die Kontrolle darüber, und dann kann ich auch den kritischen Pfad zusammenlegen.

    EDIT 2:

    GoodCpp schrieb:

    Au Backe, das klingt nach USA. Jeder kann eine scharfe Waffe(C++) tragen und wenn jeder sich an Regeln hält "kann" das auch gut gehen.

    C++ ist, muss man an der Stelle sagen, halt angenehmer. Komfortabler. Ich hingegen mag es eher einfacher. Diese goto -Struktur habe ich übrigens vom Lesen von disassemblierten Maschinencode übernommen, weil die Compiler das meistens auch so machen. Also, versuchen, den Code zusammenzulegen.



  • GoodCpp schrieb:

    Die neuen C++ Standards sollen ja viele Verbesserungen erfahren haben. Ich selbst kann das alles nicht beurteilen, sondern ich versuche nur meine Weg zu gutem C++ mit Hilfe des Forums hier abzustecken. Das scheint gar nicht so einfach zu sein. Klar könnte ich einfach einen andere Programmiersprache wählen, aber ich bin halt sehr an der Königsklasse interessiert. Die Sprache soll mich unterstützen und mich nicht aufhalten. Da C++ aber sooo viele Möglichkeiten bietet empfinde ich es als sehr schwer die für mich wirklich notwendigen Sachen raus zu filtern.

    C++ ist keine Königsklasse, sondern einfach nur ein Abkömmling von C. Man hat Möglichkeiten geschaffen, genuinen C-Problemen aus dem Weg zu gehen, dafür aber völlig neuartige Fallstricke eingebaut.

    Wie du schon schriebst, bietet C++ eine beträchtliche Fülle an möglichen Herangehensweisen an eine Programmieraufgabe. Ich persönlich empfehle, immer das Einfachste zu nehmen, so dass der Code übersichtlich und selbstdokumentierend bleibt.

    Der Mensch hat irgendwie einen Hang dazu, alles zu verallgemeinern. Dadurch fühlt er sich schlauer als die anderen. Doch Hinzufügen von Komplexität ist selten gut.


Anmelden zum Antworten