fat-lobyte hat geschrieben:Xin hat geschrieben:Allerdings bin ich auch noch 'alte Schule', weiß dass das funktioniert und auch nicht von allem, was C++ an Libs mit sich bringt überzeugt. Vielleicht kannst Du mir die andere Seite ja näher bringen.
Da gibt es so einige Konzepte. Beispielsweise gibt es in C++ viel weniger Gründe Zeiger zu verwenden, denn Referenzen kapseln die Details der Zeigerhandhabung weg.
Du weist, ich liebe Referenzen. Aber Zeiger sind weiterhin notwendig. Es fällt mir leichter den Nutzen von Referenzen zu vermitteln, wenn die Leute wissen, wie sie mit Zeigern Fehler machen.
Ich erkläre den Leuten gerne 'Hier habt ihr eine Lösung für ein Problem und hier gibt's ein neues Problem.' Und das wiederholt sich solange, bis die Leute programmieren können.
fat-lobyte hat geschrieben:Außerdem wird sehr viel mit Destruktoren und Konstruktoren gearbeitet, damit kann man allein mit der "Lebenszeit" eines Objektes viel ausdrücken. Beispielsweise muss man in C eine Datei immer schließen. Ein C++ Filestream wird bei der Destruktion automatisch geschlossen. Wenn man das im zusammenhang mit dem "Scope" einer Variable betrachtet, wird das extrem nützlich.
Richtig. Und für einen Anfänger zu komplex, wenn er erstmal verstehen muss, wie eine Funktion arbeitet.
fat-lobyte hat geschrieben:Dann gibts noch natürlich noch die Templates: sie liefern Allgemeinheit ohne Laufzeitoverhead.
Für einen Anfänger absolut nicht zu gebrauchen.
fat-lobyte hat geschrieben:Nicht nur dass, sie eröffnet ungeahnte möglichkeiten, zum Beispiel Metaprogrammierung. Boost.Spirit ist ein Parser Framework (Flex und Bison übernehmen z.B. ähnliche Funktionalität), das aus reinem C++ Code besteht, und mithilfe von dieser Template metaprogrammierung einen Parser aufbaut: zur Kompilierzeit!
Ich kenne Spirit nicht, aber ich sehe Metaprogrammierung über Templates relativ kritisch. Und wieder sehe ich keine Chance, das einem Anfänger zu vermitteln.
fat-lobyte hat geschrieben:Die Operatorenüberladung erlaubt eine Integration von selbstdefinierten Typen in so einer Art, dass man manchmal vergisst, dass sie selbstdefiniert sind. Manchen Programmierern ist das ein Dorn im Auge, allerdings finde ich dass diese Möglich eine Intuitivere verwendung der Sprache erlaubt.
Vergleichsweise einfach zu vermitteln, aber zuvor müssen Funktionen bekannt sein.
fat-lobyte hat geschrieben:Zugegebenermaßen ist es für mich schwierig Beispiele zu Formulieren, vor allem weil sie bei sehr kleinen und einfachen Programmen (Beispielprogrammen eben) nicht sofort erkennbar sind. Der Unterschied in der Komplexität wird erst in großen Programmen bemerkbar. Vergleiche sind nicht leicht zu finden: wer schreibt denn schon ein Programm in C, um es dann sofort darauf in C++ zu schreiben?
Außerdem werde ich dich wahrscheinlich nicht überzeugen können: Du hast einen Lösungsansatz, ich habe einen Lösungsansatz. Natürlich glaube ich, dass meiner der "Beste" ist, und du glaubst dass deiner der "Beste" ist. Deiner hat vor- und nachteile, genau wie meiner. Hier einen Objektiven Vergleich zu treffen ist schwierig.
Ich sehe bisher nichts, was Du in C++ sinnvoll vermitteln kannst, ohne vorher C zu kennen.
Bevor jemand versteht, was cout macht, also was ein Objekt ist, muss er verstehen, was eine Methode ist. Und am Anfang stellt sich für mich die Frage, wie ich etwas programmiert bekomme, ohne den Anfänger mit Informationen zuzumüllen. Für C muss ich erklären, was includes sind, was Datentypen sind, wie eine (main)-Funktion aufgebaut ist und was der Rückgabewert bedeutet.
Hier hat PHP mal einen klaren Vorteil: print "Hallo Welt"; und fertig.
Und für C++ Hello World muss ich auch noch erklären, dass Datentypen klassifizieren und es statische Objekte gibt... Um einem Schüler einen nachvollziehbaren Start zu ermöglichen, muss er bereits verstehen, was er durch 'Hello World' lernen soll.
Den ersten Schritt in C finde ich schon recht aufwendig - in C++ überfordert er das Verständnis vollkommen.
Ich mag es nicht, den Schüler etwas tippen zu lassen, was er nicht nachvollziehen kann.
fat-lobyte hat geschrieben:Xin hat geschrieben:OOP zu erklären schließt sich ja mit dem Einstieg durch C nicht aus.
Natürlich schließt es das nicht aus. Nur ist es nunmal so, dass wenn jemand C++ lernen will, er nicht bei C anfangen muss.
Das ist ganz einfach nicht Notwendig. Manchmal ist es sogar hinderlich:
C- Programmierer werden lernen sich mit char* strings herumzuärgern,
Und ich quäle sie sehr damit und wer string-Verarbeitung mit std::string lernt, mit dem will ich nicht programmieren. Der hat nämlich vermutlich keine Ahnung von Arrays.
fat-lobyte hat geschrieben:mit den ganzen strncat, strcpy, strtok und anderen schweinereien. (eine völlig Korrekte handhabung von char[]s ist einem Anfänger nicht zuzutrauen. Das öffnet allerdings sicherheitslücken!) Sie werden lernen, dass man einer Funktion - wenn sie ihren Parameter verändern soll - einen Zeiger übergeben muss. Sie werden Lernen, Verkettete Listen zu schreiben, sie werden lernen dass es keine Möglichkeit gibt über Fehler zu informieren, als über den Rückgabewert oder einen zusätzlichen Zeiger.
Blödsinn. Sie lernen Möglichkeiten, die notwendig sind und sie lernen weiter Möglichkeiten, wenn sie auf C++ wechseln. Und sie lernen Vor- und Nachteile der einzelnen Möglichkeiten.
fat-lobyte hat geschrieben:Und wieso lernen sie das? Wenn sie C++ anfangen, müssten sie alles von neu lernen. Sie haben eine sichere String klasse, sie haben Referenzen, sie haben die STL, sie haben Exceptions.
Das Gehirn allerdings ist nun schon auf C eingestellt. Sie empfinden C++ als "eine Nette erweiterung", eigentlich aber nicht viel mehr.
Dann gebe ich Deinem Vorurteil mal Futter: C++ ist zu großen Teilen eine Erweiterung zu C.
OOP habe ich nicht in C++ gelernt oder in einer Sprache, die als objektorientiert gilt, sondern in C. Man kann in C problemlos OOP programmieren und ganz ehrlich, wer es in C mal gemacht hat, der weiß, was er tut und der weiß auch, warum er danach C++ nimmt.
Ich halte auch von Exceptions nicht viel - um ehrlich zu sein, ich halte sie für eine Fehlentwicklung, denn sie kostet Rechenleistung und wird in der Regel so angewandt, dass vor dem Absturz des Programms eine Popup-Box aufgeht, die mich darauf hinweist, dass meine Daten verloren sind, sobald ich auf 'Okay' drücke und mich dann bittet auf den einzig vorhanden Button mit der Aufschrift 'Okay' zu drücken. Exceptions? Sehr gute Idee, in meinen Augen nur leider an der alltäglichen Realität vorbei. Faktisch bliebt bei den meisten Programmen über, dass die Programme gebremst werden und dafür über überhaupt keine brauchbare Fehlerbehandlung mehr verfügen.
In dem Fall und besonders in dem Fall hoffe ich darauf, dass die Leute verstehen, wie Fehlerbehandlung in C aussieht. Wo nämlich kein Sicherungsseil ist, da gehen die Leute vorsichtig. Exceptions bieten Sicherheit - und die in der Regel genutzte Möglichkeit Verantwortung weiterzureichen, bis keiner mehr weiß, was eigentlich passiert ist und man das ganze nur noch an das Popup weiterreichen kann.
Programmieren lernen bedeutet jahrelang zu lernen und Erfahrungen zu sammeln, denn niemand hat sich bisher die Mühe gemacht, eine Sprache erst zu lernen und dann ein ganz wichtiges Projekt zu beginnen. Alle lernen programmieren in der Praxis. Es gibt keinen Weg, Programmieren zu lernen, ohne unsichere und falsche Programme zu schreiben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.