C zu C++ - Einfacherer Übergang?



  • DEvent schrieb:

    Nö, da steht "TODO: Auto generated catch block". Es ist also auf meiner "TODO-Liste".

    Todo Listen sind geduldig.



  • namespace invader schrieb:

    Aber ich gebe ja zu, dass die Frage, was schöner, eleganter Code ist und wann man welchen schreiben sollte, subjektiv ist und auf eine Grundsatzdiskussion hinausläuft.

    Einige Grundvoraussetzungen gibt es: zum Beispiel komplette Fehlerbehandlung. In vielen C Projekten fehlt diese und wird durch exit(EXIT_FAILURE) oder kurzer Hand abort() gelöst, und das Problem teilt C (z.B. Fortran) mit vielen anderen Sprachen ohne Exception-Handling.



  • krümelkacker schrieb:

    Je nach Definition für "verstehen". Dabei sollte es nicht darum gehen, die Regeln um jedes Feature zu kennen.

    Was aber essentiell wichtig ist, um C++ anzuwenden.

    krümelkacker schrieb:

    Du beschreibst C++ als lose Sammlung von schlecht zusammenpassenden Features. Eine Erklärung dafür wäre, dass Du C++ "nicht verstanden" hättest.

    Eine weitere Erklärung wäre, daß zu der Zeit, zu der C++ entwickelt wurde, verzweifelt ein Weg aus der Software-Krise gesucht wurde. So hat man einfach C um wahllose Features erweitert. Ein Indiz für dieses chaotische Vorgehen ist IMHO, daß erste viele Jahre später C++ Techniken erfunden wurden, an die der Erfinder der Sprache nicht im Traum dachte.

    krümelkacker schrieb:

    Eine andere wäre, dass Du übertrieben hättest. Ich schätze, es ist mindestens ein bischen was von beiden.

    Ein Funke Wahrheit steckt in allem davon. C++ kann besser sein als sein Ruf, aber das liegt vermutlich nur daran, daß sich haufenweise Enthusiasten darauf gestürzt haben, von deren Erkenntnissen wir alle zehren. Nachteil ist, daß C++ nur echten Könnern sein Potential offenbart. Dem Durchschnittsprogrammierer erscheint C++ als das, was es wirklich ist: ein willkürlicher Mix aus Erweiterungen, die C aufgestülpt wurden und vor deren korrekter Anwendung die Götter viel Erfahrung und eine schmerzliche Lehrzeit mit vielen Rückschlägen gesetzt haben.



  • ich denke c++ hätte viel mehr erfolg wenn man nicht versucht hätte es mit c zu mischen. dadurch entstehen sachen die a unschön und b verwirrend sind.

    lg lolo



  • noobLolo schrieb:

    ich denke c++ hätte viel mehr erfolg wenn man nicht versucht hätte es mit c zu mischen.

    Dann wäre es wahrscheinlich so "erfolgreich" wie D. C++ hat ganz sicher stark davon profitiert, dass es die alten C Libraries verwenden konnte.



  • 30.Spieltag schrieb:

    noobLolo schrieb:

    ich denke c++ hätte viel mehr erfolg wenn man nicht versucht hätte es mit c zu mischen.

    Dann wäre es wahrscheinlich so "erfolgreich" wie D. C++ hat ganz sicher stark davon profitiert, dass es die alten C Libraries verwenden konnte.

    Damals != Heute.



  • Oh, endlich wieder beim Thema zurück.

    krümelkacker schrieb:

    Wenn ich mal all das entferne, was für mich nach Flame-Bait bzw Vorurteile aussieht,

    Na ich gebe ja zu, dass vielleicht etwas von meiner subjektiven Abneigung gegen C++ darin eingeflossen ist. Es es kann ja keiner ahnen, dass hier so viele C++-Fans lauern, die gleich so gereizt darauf reagieren...

    bleibt folgendes übrig: "Ich glaube, dass es besser ist, vor C++ die Sprache C zu lernen, weil C++ auf C basiert und Sprachfeatures hinzufügt."

    Ja genau. Zumindest dann, wenn man vorhat, beides zu lernen; und erst recht, wenn man (wie der OP) noch gar nicht weiß, ob man überhaupt auch C++ lernen will.

    Wenn es vor allem darum geht, nur C++ zu lernen, und man von C wirklich nichts wissen will, kann man natürlich auch gleich C++ lernen. Darauf bezieht sich dein Zitat, wobei ich das auch nicht für ganz objektiv halte, es kommt ja von C++-Enthusiasten. Trotzdem halte ich das gleich-C++-lernen für keine gute Idee, denn

    1. ist nicht so richtig einzusehen, warum jemand nur C++ und absolut nicht C lernen will (auch wenn C++-Fanatiker natürlich der Meinung sein werden, dass C++ ja die allerbeste Sprache überhaupt ist und man keine andere Sprache mehr braucht, sobald man C++ kann). C ist letztendlich "Grundwissen" und auch einfach und klein genug, um es relativ schnell zu lernen. Und wenn man anschließend C++ lernt, wird man das meiste von C ohnehin noch brauchen.

    2. enthält C++ nunmal viele "alte" Sprachbestandteile aus C, es ist nicht aus einem Guss und enthält viele redundante Features. Also z.B. sowohl Pointer als auch Referenzen für Call-by-Reference, der Präprozessor denn man dann doch nicht nutzen soll, C-Strings und stl Strings, Strukturen und Klassen, malloc und new, und überhaupt die ganze C-Standardbibliothek und die stl, die genau das selbe macht. Wenn man C++ lernt, ohne C zu kennen, verwirrt einen das alles, weil man nicht nachvollziehen kann, was diese ganzen doppelten Features sollen und was sich die Sprachdesigner dabei gedacht haben. Lernen muss man sie trotzdem, denn man wird ja C++-Programmen begegnen, die sie verwenden. Schlimmstenfalls wird man sich angewöhnen, die aus C übernommen Features zu nutzen und nicht die passenden C++-Features, die sie eigentlich ersetzen sollen, einfach weil man nicht versteht, dass das nur die "Altlasten" von C sind, die nur aus Kompatibilitätsgründen in der Sprache sind.

    Je nach Definition für "verstehen". Dabei sollte es nicht darum gehen, die Regeln um jedes Feature zu kennen. Wichtig ist, dass man damit auch etwas anzufangen weiß.

    Ersteinmal geht es beim Lernen einer Sprache aber darum, die Sprachfeatures genau zu verstehen. Was man damit anfangen kann, sollte einem halbwegs intelligenten Menschen selbst klar werden, ggf. mit ein paar kleinen Denkanstößen.

    Zumindest bei einer gut designten Sprache. Dass man die Unmengen von Features von C++, die teilweise auch noch redundant und unnötig kompliziert sind, als Anfänger gar nicht alle wirklich verstehen kann und damit gezwungen ist, die Benutzung der Sprachfeatures, also Herangehensweisen usw., in Form von den ganzen "C++ Idioms" zu erlernen und die dahinter verwendeten Sprachfeatures erst nach und nach zu verstehen, ist ein C++-spezifisches Problem.

    In Endeffekt geht es aber darum, die Sprachfeatures zu verstehen. Und dabei hilfreich sind C-Kenntnisse einerseits, weil man dann die aus C übernommen Teile schonmal versteht, und andererseits, weil man, wenn man die Unzulänglichkeiten und Beschränkungen von C kennt, besser die Motivation der C++-Designer nachvollziehen und die dabei herausgekommen C++-Features besser verstehen kann.

    Du beschreibst C++ als lose Sammlung von schlecht zusammenpassenden Features. Eine Erklärung dafür wäre, dass Du C++ "nicht verstanden" hättest. Eine andere wäre, dass Du übertrieben hättest.

    Eine dritte Erklärung wäre, dass ich recht habe 🤡



  • namespace invader schrieb:

    Und wenn man anschließend C++ lernt, wird man das meiste von C ohnehin noch brauchen.

    Nein. Wenn man C++ richtig lernt, braucht man C nicht mehr.

    namespace invader schrieb:

    Schlimmstenfalls wird man sich angewöhnen, die aus C übernommen Features zu nutzen und nicht die passenden C++-Features, die sie eigentlich ersetzen sollen, einfach weil man nicht versteht, dass das nur die "Altlasten" von C sind, die nur aus Kompatibilitätsgründen in der Sprache sind.

    Genau das passiert, wenn man zuerst C lernt. Wenn man gleich vernünftig C++ lernt, dann weiß man was man zu benutzen hat.

    Structure und class sind übrigens nicht redundant, sondern lässt sich wunderbar für semantische Zwecke nutzen.



  • 'typsicher zur Compile-Zeit' und 'objektorientiert' sind eben zwei Eigenschaften, die schlecht unter einen Hut zu bringen sind. Vor allem, wenn im Interesse des vollen Hardware-Zugriffs noch ein explizites Zeigerkonzept zu berücksichtigen ist.

    Unverwässerte OO - "alles ist ein Objekt", einschließlich Code, Blöcke, Klassen - erfordert einen Grad an Selbstreflexion und somit an Formbarkeit des Systems zur Laufzeit, der wo mit statischer Typisierung schwer vereinbar ist.

    Es sei denn, man läßt so weitreichend Teilaspekte der OO außen vor, daß man die verbleibende Rest-OO auf syntaktischer Ebene simulieren kann: "namespace feature".

    Dann wird's erfahrungsgemäß syntaktisch kompliziert, weil man Laufzeit-Eigenschaften des Systems schon zur Compilezeit voraussagen muß. Stichwort Typ-Sicherheit zur Compile-Zeit.



  • namespace invader schrieb:

    1. ist nicht so richtig einzusehen, warum jemand nur C++ und absolut nicht C lernen will

    Aus dem selben Grund warum ich Visual Basic .NET lernen will ohne vorher Visual Basic 6 gelernt zu haben. Weil sie eben nicht nur unterschiedliche Sprachen sind, sondern auch unterschiedliche Denkweisen verlangen.

    Bei der Programmierung geht es doch zu einem grossen Teil nur um Denkweisen. Wenn man Java programmiert muss man in Java denken, wenn man C programmiert muss man in C denken. Warum sollte ich nun lernen wie ich in C denke wenn ich garnicht in C programmieren will?

    Und wenn man anschließend C++ lernt, wird man das meiste von C ohnehin noch brauchen.

    Nur dass dann so Sachen wie RAII wie du ja an dir selber siehst problematisch werden.

    2. enthält C++ nunmal viele "alte" Sprachbestandteile aus C, es ist nicht aus einem Guss und enthält viele redundante Features. Also z.B. sowohl Pointer als auch Referenzen für Call-by-Reference,

    Diese Features sind nicht redundant. Aber ja C++ enthaelt eine Menge features - nur warum ist es wichtig zuerst die Untermenge zu lernen und dann einen Teil davon zu vergessen und dann die richtige Menge zu lernen?

    zB Fehlerbehandlung in C, generizitaet ueber void* und makros, makros statt inline templates - eben eine komplett andere Denkweise -> wozu das lernen um es wieder zu vergessen?

    Wenn man C++ lernt, ohne C zu kennen, verwirrt einen das alles, weil man nicht nachvollziehen kann, was diese ganzen doppelten Features sollen und was sich die Sprachdesigner dabei gedacht haben.

    Deine private Meinung die leider unhaltbar ist. Da schon millionen Leute C++ ohne C vorkenntnisse gelernt haben und nicht verwirrt waren.

    Zumindest bei einer gut designten Sprache. Dass man die Unmengen von Features von C++, die teilweise auch noch redundant und unnötig kompliziert sind, als Anfänger gar nicht alle wirklich verstehen kann und damit gezwungen ist, die Benutzung der Sprachfeatures, also Herangehensweisen usw., in Form von den ganzen "C++ Idioms" zu erlernen und die dahinter verwendeten Sprachfeatures erst nach und nach zu verstehen, ist ein C++-spezifisches Problem.

    Nein. Man lernt immer Idiome. Idiome sind die anfassbaren Teile der Denkweise.

    while(*trg++=*src++);
    

    Das ist ein Idiom in C dass jeder kennen muss. Genauso ist RAII ein Idiom in C++ das jeder kennen muss. Idiome sind die Ausdruecke der Denkweise.

    Und dabei hilfreich sind C-Kenntnisse einerseits, weil man dann die aus C übernommen Teile schonmal versteht, und andererseits, weil man, wenn man die Unzulänglichkeiten und Beschränkungen von C kennt, besser die Motivation der C++-Designer nachvollziehen und die dabei herausgekommen C++-Features besser verstehen kann.

    Und das alles ohne Smalltalk Kenntnisse? Wie soll man die C++ features ohne smalltalk verstehen? Oder Java ohne C?

    Das macht keinen Sinn. Eine Sprache wird von vielen Seiten beeinflusst, es macht vielleicht aus akademischer Sicht Sinn alle Einfluesse genau zu kennen, aber aus pragmatischer Sicht sind die vollkommen uninteressant.

    Lehre mal Leuten die C++ lernen wollen zuerst die Denkweise von C und dann die von C++ und schau was rauskommt. Du kannst das wunderschoen hier im Forum bestaunen. Naja, das Problem wird sein, dass du den Unterschied halt nicht verstehst, aber das Resultat ist dann eben ein C mit Klassen. Nur C mit Klassen ist eine Katastrophe.

    Aus dem Naehkaestchen geplaudert:
    Mein Tutorial ist zwar schon recht alt aber ich habe immer wieder unterhaltungen mit Leuten die es lesen um C++ zu lernen. Und da hat sich fuer mich klar rauskristallisiert (wie eben im Forum auch) dass C zuerst zu lernen eine schlechte Idee.

    Diese Meinung teilen uebrigens auch alle C++ groessen 😉
    Siehe zB: http://www2.research.att.com/~bs/learn.html
    Oder auch die offizielle FAQ von alt.comp.lang.learn.c-c++: http://www.faqs.org/faqs/C-faq/learn/
    Und bedenke, diese Meinung haben Leute die sowohl C als auch C++ sehr gut kennen, waehrend du nur C gut kennst und ueber C++ nur mutmassungen anstellst.

    Wem soll man mehr vertrauen?



  • und wie erklärt man das Öffnen eines Files in C++ ohne auf C-Spezialitäten wie char* zurückzugreifen ?

    myIfstream.open(myFileName.c_str(),...)
    

    c_str() ist dann eine Methode, die einen string ... verzaubert 😕 😉



  • zum Beispiel schrieb:

    und wie erklärt man das Öffnen eines Files in C++ ohne auf C-Spezialitäten wie char* zurückzugreifen ?

    Warum sollte man das tun wollen?
    char* ist Teil von C++.

    Ich erklaere ja auch int, double, float,... warum dann nicht char*?

    Oder meinst du char* ist C und std::string ist C++? Weil dann hast du nicht viel verstanden...

    Die Frage ist doch eher:
    warum sollte ich
    fopen(file, "r")
    erklaeren um dann naechste Woche
    ifstream f(file);
    erklaere?

    Das verwirrt die Leute. Eine Erklaerung dass ein String in C++ nunmal ein char* ist, verwirrt dagegen nicht. Denn ein String in C++ ist nunmal ein char*. std::string ist ein Helferlein um den Umgang mit rohen char* zu vereinfachen.

    Bitte kommt von dieser Verirrung weg, dass alles was man in C macht in C++ nicht gemacht werden sollte. Das ist schwachsinn. Wenn man sagt C++ ist eine andere Sprache als C, dann meint man die Denkweise und die herangehensweise an Probleme. Aber einen int oder eine struct verwende ich in C++ immer noch gleich.

    Genauso wie ich einen int auch noch in Java verwenden darf... Die Syntax ist halt sehr aehnlich... Aber syntax ist syntax und nicht semantik. Ein char* wird in C++ semantisch etwas anders verwendet als in C.



  • namespace invader schrieb:

    bleibt folgendes übrig: "Ich glaube, dass es besser ist, vor C++ die Sprache C zu lernen, weil C++ auf C basiert und Sprachfeatures hinzufügt."

    Ja genau. Zumindest dann, wenn man vorhat, beides zu lernen; und erst recht, wenn man (wie der OP) noch gar nicht weiß, ob man überhaupt auch C++ lernen will.

    Wer C++ lernt, lernt C gleich mit. IMHO ist es für den C++-Lernwilligen unsinnig, zuerst C und dann C++ zu lernen.

    Wer aber C++ nicht lernen mag oder muß, der kann selbstverständlich nur C lernen.



  • veritySeeker schrieb:

    Wer C++ lernt, lernt C gleich mit.

    Falsch. Einfach nur falsch..



  • Janjan schrieb:

    veritySeeker schrieb:

    Wer C++ lernt, lernt C gleich mit.

    Falsch. Einfach nur falsch..

    Du meinst also, man sollte doch zuerst C lernen? 😕
    Etwas mehr solltest Du schon dazu schreiben.



  • Shade Of Mine schrieb:

    Denn ein String in C++ ist nunmal ein char*.

    über diesen Satz muß ich erst meditieren 🙂

    Bis dahin:

    Shade Of Mine schrieb:

    std::string ist ein Helferlein um den Umgang mit rohen char* zu vereinfachen.

    ja, und wie erklärt man das einem C++ noob, ohne auf C zurückzugreifen ?

    "das könnt Ihr jetzt mal nicht verstehen" oder wie 😃



  • Das Problem, wenn man zuerst C lernt, besteht vor allem auch darin, dass der Grossteil des Codes weiterhin funktioniert. Man ist nicht gezwungen, die C++-Äquivalente zu verwenden, weil die C-Mittel immer noch auszureichen scheinen.

    Man hat sich als C-Programmierer für viele Bereiche schon Techniken angeeignet, auf die man nicht ohne Weiteres verzichtet. Ich habe den Eindruck, vielen Programmierern fällt es schwer, alte Gewohnheiten abzulegen und sich aktiv mit Alternativen auseinanderzusetzen, da dazu kein zwingender Grund besteht. Doch auf diese Weise lernt man nichts Neues, C++-Spezifisches. Wenn man hingegen direkt mit C++ anfängt, besitzt man noch keine Herangehensweisen an Probleme und muss diese von Grund auf neu lernen, und zwar direkt in C++.

    Das ist auch kein C-spezifisches Problem. Im C++-Forum sieht man immer wieder, wie z.B. Java-Umsteiger Mühe haben, weil sie überall new verwenden und mit Wertsemantik nicht vertraut sind. Bei Sprachen, die sich oberflächlich so ähnlich sind, werden die Unterschiede meistens unterschätzt.



  • veritySeeker schrieb:

    Janjan schrieb:

    veritySeeker schrieb:

    Wer C++ lernt, lernt C gleich mit.

    Falsch. Einfach nur falsch..

    Du meinst also, man sollte doch zuerst C lernen? 😕
    Etwas mehr solltest Du schon dazu schreiben.

    Damit meine ich, dass man C nicht gleich mit lernt, wenn man C++ lernt. Ist auch gar nicht notwendig. printf, malloc und all den restlichen C müll kann man getrost weglassen.

    zum Beispiel schrieb:

    Shade Of Mine schrieb:

    std::string ist ein Helferlein um den Umgang mit rohen char* zu vereinfachen.

    ja, und wie erklärt man das einem C++ noob, ohne auf C zurückzugreifen ?

    "das könnt Ihr jetzt mal nicht verstehen" oder wie 😃

    Dann schneidet man das Thema C-Strings an, erklärt wie sie arbeiten (roher Speicher, \0-terminiert) und erzählt auch gleich was für eine Qual es ist damit zu arbeiten.



  • veritySeeker schrieb:

    Janjan schrieb:

    Falsch. Einfach nur falsch..

    Du meinst also, man sollte doch zuerst C lernen? 😕
    Etwas mehr solltest Du schon dazu schreiben.

    Janjan mag C nicht und ist wohl der Meinung, man solle C gar nicht lernen, weder einzeln noch mit C++ mit.



  • zum Beispiel schrieb:

    Shade Of Mine schrieb:

    std::string ist ein Helferlein um den Umgang mit rohen char* zu vereinfachen.

    ja, und wie erklärt man das einem C++ noob, ohne auf C zurückzugreifen ?

    Wer sagt denn, dass man nicht auf C zurückgreifen darf? Wie schon erwähnt finden sehr viele Dinge aus C weiterhin Anwendung in C++. Aber für sehr viele Dinge gibt es eben auch Alternativen.


Anmelden zum Antworten