C++ lernen mit C Vorkenntnissen



  • hallo,
    ich möchte gerne C++ lernen. In der Uni habe ich bereits im Fach Maschinenbau ein Semester mit C programmiert, allerdings kann ich meinen Kenntnisstand schlecht einschätzen. Ich habe mich mit C in diesem halben Jahr aber schon circa 110 Zeitstunden beschäftigt.

    Das komplizierteste, was ich nach dem Semester auf eigene Faust programmiert habe, war ein Gleichungslöser für eine 3x3 Matrix mit einem 1x3 Lösungsvektor anhand der LR-Zerlegung bzw. Gaußelimination und zur Überprüfung des Ergebnisses eine Matrix Multiplikation. Also, falls das jemandem was sagt. 🙂

    Nun möchte ich in meinen Semesterferien mich in C++ einarbeiten. Es hieß immer, wenn man C schon kann, dann ist C++ zu lernen, ein nicht mehr all zu großer Aufwand mehr. Stimmt das oder müsste ich wieder so viel Arbeit hineinstecken? (1)

    Zum anderen habe ich dort, wo ich gerade bin kein Buch für C++ zur Verfügung. Kann man C++ genauso gut auch ohne Buch lernen, mit Tutorials etc? (2)

    Mein Ziel ist es, später physikalische Vorgänge mit c++ auszurechnen und darstellen zu lassen. Zum Beispiel möchte ich im einfachsten Fall eine Pendel (dargestellt durch einen balken) im zweidimensionalen Raum anhand zuvor berechneter Geschwindigkeiten und Beschleunigungen hin und her pendeln lassen. Oder mir Wurfparabeln ausgeben lassen.
    Könnt ihr mir sagen, wie ich sowas grob umsetzen kann? (3) Bisher kannte ich C Programme nur als Ausgabezeile in einer Kommandozeile. Ich kann mir zum jetzigen Zeitpunkt nicht vorstellen, wie ich etwas Grafisch umsetzen kann. Was glaubt ihr, wie weit der Weg bis dahin ist? (4)

    Ich wäre euch sehr dankbar, wenn ihr mir eine Einschätzung geben könntet.



  • 1.) Sprachsyntax ist ähnlich d.H. Schleifen, If-Else oder ähnliches ist genau wie in C. Das Problem ist die Objektorientierung. Das ist etwas was sehr schwierig sein kann wenn man aus rein prozeduralen Sprachen kommt. Da verschließt sich einem Anfangs der Sinn von Objekten.
    2.) Das ist wohl kein Problem. Gibt da einige gute Tutorials.
    3.) Da du schon C Programmiert hast solltest du die Funktionen selber erarbeiten können. Das Problem wird, wie schon gesagt. Die ganze OOP sein. Da kann man wieder viele Ansätze verfolgen. Das Pendel könnte zum Beispiel ein Objekt sein. Die Berechnungsfunktionen sind ein anderes Objekt.
    Dann machst du sowas wie

    Pendel pendel = new Pendel(.../**Irgendwelche Parameter eines Pendels**/);
    PendelZeichner pz = new PendelZeichner(...);
     pz->Zeichne(pendel);
    Parabel p = new PendelParabel(pendel);
    ...
    

    Dafür solltest du erstmal die Grundkonzepte von OOP Lernen.
    4.) Wenn du das OOP verstanden hast ist der Weg zu Grafik nicht mehr so weit wenn du zusatzbibliotheken verwendet.



  • mitglied2347 schrieb:

    Nun möchte ich in meinen Semesterferien mich in C++ einarbeiten. Es hieß immer, wenn man C schon kann, dann ist C++ zu lernen, ein nicht mehr all zu großer Aufwand mehr. Stimmt das oder müsste ich wieder so viel Arbeit hineinstecken? (1)

    Das stimmt bedingt. Wenn du C kannst, musst du dich nicht mehr um prozedurale Dinge wie Schleifen, If-Abfragen, Funktionen etc. kümmern. Falls du Zeiger schon verstanden hast, kommt dir das sicher auch zu Gute. Allerdings gibt es in C++ viele neue Sprachmittel wie Klassen, Templates, Operatoren, Namensräume, Exceptions, etc., die du auch alle lernen musst.

    Das Wichtigste ist aber wohl, dass die Programmierparadigmen in C++ ganz anders als in C aussehen. Man hat viel mehr Möglichkeiten zur Abstraktion und kann fertige Klassen für Anwendungsbereiche wie Stringverarbeitung und Speicherverwaltung einsetzen. Die Philosophie ist eine andere. In C++ verwaltet man nur noch selten manuell Speicher, malloc() und free() braucht man so gut wie gar nie. Oder man benutzt typsichere Streams statt printf() mit variablen Argumentlisten. Es ist von zentraler Bedeutung, dass du dir neue Techniken anschaust, auch wenn die alten aufgrund der Abwärtskompatibilität zu C weiterhin funktionieren. Denn wenn du C in C++ programmierst, hast du C++ noch nicht verstanden.

    mitglied2347 schrieb:

    Zum anderen habe ich dort, wo ich gerade bin kein Buch für C++ zur Verfügung. Kann man C++ genauso gut auch ohne Buch lernen, mit Tutorials etc? (2)

    Genauso gut eher nicht. Viel Hintergrundwissen wird in Online-Tutorials einfach unterschlagen, und genau dieses fehlt einem dann später für ein zusammenhängendes Verständnis. Ich würde eher mit Tutorials als gar nicht lernen, aber wenn du die Möglichkeit hast, solltest du dir unbedingt ein Buch zulegen. "Thinking in C++" kannst du sogar gratis als Online-PDF herunterladen, mach doch das. 😉

    mitglied2347 schrieb:

    Ich kann mir zum jetzigen Zeitpunkt nicht vorstellen, wie ich etwas Grafisch umsetzen kann. Was glaubt ihr, wie weit der Weg bis dahin ist? (4)

    Für grafische Ausgaben gibt verschiedene Bibliotheken, die du benutzen kannst. Mein Favorit ist hier SFML.

    Aber begehe nicht den Fehler von tausend anderen. Lies dich in Ruhe in die Grundlagen der Sprache ein, bevor du dich an Dinge wie Grafik wagst. Denn das ist ein fortgeschrittenes Thema und entsprechende Bibliotheken setzen meist gute Kenntnisse der Sprache voraus. Auch für deinen eigenen Code ist es nur von Vorteil, wenn du dich ein wenig auskennst. Du musst natürlich nicht C++-Experte sein, wenn du grafisch programmieren willst, aber die zentralen Sprachmittel und Bestandteile der Standardbibliothek solltest du schon verstanden haben.



  • mitglied2347 schrieb:

    Es hieß immer, wenn man C schon kann, dann ist C++ zu lernen, ein nicht mehr all zu großer Aufwand mehr. Stimmt das oder müsste ich wieder so viel Arbeit hineinstecken?

    Rein sprachlich basiert C++ natürlich auf C. Aber der "typische" Programmierstil ist in C++ anders. Wenn Du also in C++ so wie in C programmierst, machst Du etwas falsch. Ich denke, eine der ersten und wichtigen Lektionen ist die, dass Dir C++ erlaubt, "richtige" benutzer-definierte Typen zu erstellen, die leicht nutzbar und nicht nur reine Datensammlungen sind. Ein Paradebeispiel dafür ist std::string . Ein std::string -Objekt kannst Du wie einen int auch kopieren, zuweisen, ändern, an Funktionen übergeben, aus Funktionen zurückgeben, als Mitglieder von anderen Klassen/Struktoren verwenden etc etc etc. Dabei übernimmt die std::string -Klasse die Verwaltung des internen, dynamisch allozierten char-Arrays von ganz alleine...

    mitglied2347 schrieb:

    Zum anderen habe ich dort, wo ich gerade bin kein Buch für C++ zur Verfügung. Kann man C++ genauso gut auch ohne Buch lernen, mit Tutorials etc? (2)

    Ich würde sagen "nein". 99% der Tutorials sind Müll. Ich habe noch kein gutes gesehen. Ich lasse mich auch gerne vom Gegenteil überzeugen.

    Fedaykin schrieb:

    2.) Das ist wohl kein Problem. Gibt da einige gute Tutorials.

    Wo? Welche?

    Fedaykin schrieb:

    3.) Da du schon C Programmiert hast solltest du die Funktionen selber erarbeiten können. Das Problem wird, wie schon gesagt. Die ganze OOP sein.

    Ich würde nicht sagen, dass OO ein Problem sei. Gute C-Programmierer verstehen diese Konzepte auch und wenden sie schon an. Allerdings ohne direkte Sprachunterstützung.

    Fedaykin schrieb:

    Pendel pendel = new Pendel(.../**Irgendwelche Parameter eines Pendels**/);
    PendelZeichner pz = new PendelZeichner(...);
    pz->Zeichne(pendel);
    Parabel p = new PendelParabel(pendel);
    ...
    

    Du programmierst nicht so oft in C++ oder? Sieht mir eher nach Java aus, wobei Du "." durch "->" ersetzt hast.



  • Fedaykin schrieb:

    Dann machst du sowas wie

    Pendel pendel = new Pendel(.../**Irgendwelche Parameter eines Pendels**/);
    PendelZeichner pz = new PendelZeichner(...);
     pz->Zeichne(pendel);
    Parabel p = new PendelParabel(pendel);
    ...
    

    Dafür solltest du erstmal die Grundkonzepte von OOP Lernen.

    So macht man es in C++ eben genau nicht, selbst wenn der Code kompilieren würde. Die ganzen ungeschützten Speicheranforderungen sind viel zu fehleranfällig und teilweise auch unnötig. RAII und automatische Objekte sind Stichwörter.

    Davon abgesehen unterstützt C++ weit mehr Programmierparadigmen als nur OOP. Im Vergleich zu Sprachen wie Java oder C# zieht auch die Standardbibliothek objektorientierte Programmierung viel weniger strikt durch und setzt oft auf generische Programmierung, um Komponenten zu entkoppeln (Beispiel STL).



  • okay, danke... dann habe erstmal einen überblick und weiß, wo ich lang muss... 🙂



  • mitglied2347 schrieb:

    Es hieß immer, wenn man C schon kann, dann ist C++ zu lernen, ein nicht mehr all zu großer Aufwand mehr. Stimmt das oder müsste ich wieder so viel Arbeit hineinstecken?

    Wie schon die beiden anderen geschrieben haben hat C++ andere Paradigmen und daher einen grundlegend anderen Programmierstil als C, auch wenn einige syntaktische Elemente die selben sind. Das machts eigentlich eher schwieriger, ordentliches C++ mit C-Vorkenntnissen zu lernen als ohne Vorkenntnisse, weil einfach ständig der Versuchung widerstanden werden muss. ALLES genauso wie in C zu machen. Der richtige Ansatz wäre vermutlich:

    1. Vergiss was du aus C kennst und geh davon aus dass es in C++ anders ist.
    2. Wenn dann doch etwas bekannt vorkommt gilt es, sich genau zu merken wo die Gemeinsamkeiten anfangen und wo sie aufhören.

    Schon da werden sich die Meinungen spalten, die einen werden sagen, dass das meiste, was allgemein als "oldscool C" bezeichnet wird, auf keinen Fall in C++-Code gehört, die anderen werden argumentieren dass laut C++-Standard C eine Untermenge von C++ ist und damit auch C-Code im C++-Code stehen darf. Die Wahrheit liegt vermutlich irgendwo dazwischen, ich denk man sollte C++ als eigene Sprache sehen, die nicht ohne weiteres mit C gemischt werden sollte. Allerdings kann man (wie in einigen anderen Sprachen auch) dort, wo es notwendig ist, durchaus C-Einschlüsse einbauen. Kurz: einbinden ja, aber die Sprachen getrennt halten und kein homogenes C/C++-Gemisch draus machen.

    Ich denke du wirst dir da deine eigene Meinung bilden müssen, auf jeden Fall würde ich den Satz "Wenn man C schon kann, dann ist C++ zu lernen, ein nicht mehr all zu großer Aufwand mehr." nicht unhinterfragt stehen lassen.

    Da ich weiß wie es hier im Forum ab und an zugeht hier eine kleine Randbemerkung und Warnung an alle: dieser Thread sollte nicht wieder in einen C vs. C++-Flamewar ausarten, die Diskussion von Vor-und Nachteilen einzelner Features ist off topic und unangebracht. Bleibt also bitte beim Thema.



  • Es ist nicht hinderlich C zu kennen, um C++ dazu zu lernen. Was neu hinzu gekommen ist, lässt sich in Schritten von einfach bis schwieriger erlernen. Vorschlag der Lernfolge:
    1. Die Streamklassen von C++ für input und output aneignen. Der Verzicht auf z.B printf und scanf ist schon mal überzeugend.
    2. Eigene Klassen aus früheren Strukturen bilden und erfahren, was die mehr können. Weckt Lust auf sehr viel mehr.
    3. Nicht gleich mit MFC oder VCL beginnen. Ist für jemanden mit C-Hintergrund nicht sofort verständlich.
    4. Erst dann an die weiteren Dinge von C++ herangehen.
    Genauso sind die bereits mit C erfahrenen Programmierer seinerzeit auch vorgegangen als es eines Tages C++ gab. Man braucht für C++ keine andere Denkweise, nur eine erweiterte. Diese Aussage gefällt den Puristen von C++ jedoch nicht besonders und löst - wie pumuckl sagt - hier oft unsinnige Diskussionen aus.



  • Wenn Du doch C kannst, warum lernst Du nicht damit die Oberfläche zu gestalten? direkt mit der API oder einer Lib? Muss ja nicht immer C++ sein. Dass ist nämlich auch einer der falschen Vorstellungen die Anfänger haben, dass man mit C nur in der Console Werkelt. Dabei ist C in verbindung mit der API ja genau das was die meisten Lib's abstrahieren.



  • Der Thread ist über 2 Jahre alt...


Anmelden zum Antworten