Möchte C++ / programmieren lernen



  • Hört sich ja alles schön und gut an, aber meine persönliche Meinung ( und die von anderen Forenmitgliedern hier bestimmt auch ) ist es nicht mit C vor C++ zu beginnen.

    Wenn man ehe danach C++ lernen will, könnte der C-Style einem den Code in C++ versauen. Wenn man mit C++ von Null anfängt, dann bekommt man auch alles von C-Strukturen aus C++ mit.

    Ich habe noch nie ein C-Buch/Tutorial gelesen, trotzdem verstehe ich jeden C-Code und könnte auch selber in C programmieren.

    Wenn ich mit C angefangen hätte, würde es mir schwerer fallen mich auf C++ einzustellen und die "C++ Konzepte" zu lernen.

    Mit C anfangen -> C++ lernen
    Mit C++ anfangen -> C verstehen

    Naja jeder sollte die für sich beste Methode auswählen, um sein Ziel zu erreichen und wenn du mit deinem Methoden Erfolg hast, dann sag ich dagegen auch nichts 😉 ( nur das ich es nicht so machen würde 🙂 ).



  • KasF schrieb:

    Hört sich ja alles schön und gut an, aber meine persönliche Meinung ( und die von anderen Forenmitgliedern hier bestimmt auch ) ist es nicht mit C vor C++ zu beginnen.

    Und...?

    Viele Leute lesen auch die Bildzeitung.
    Die subjektive Meinung anderer ist doch kein Kriterium für meine subjektive Meinung. Anhand meiner Erfahrungen komme ich zu dem Schluss, dass Programmierung ein evolutionärer Prozess ist, den man als Programmierer nachvollziehen muss. Und das Funktioniert am besten so, wie er nunmal stattgefunden hat.

    KasF schrieb:

    Wenn ich mit C angefangen hätte, würde es mir schwerer fallen mich auf C++ einzustellen und die "C++ Konzepte" zu lernen.

    Mit C anfangen -> C++ lernen
    Mit C++ anfangen -> C verstehen

    Als Pilot sollte ich erst den A380 fliegen und dann verstehe ich auch, wie ein Sportflugzeug funktioniert.
    Ich fahre zuerst die Regatta und dann verstehe ich, wie man auf'm Baggersee eine Nußschale bewegt.
    Ich mache erst den Führerschein für Schwertransporter, dann verstehe ich auch so, wie man einen PKW fährt.

    Ich bin Sporttaucher. Als Anfänger sollte man erstmal Bergungstauchgänge in 40m tief gelegenen Höhlen machen. Dann versteht man auch, wie man in 5 Metern Tiefe taucht.

    Aus irgendeinem Grund tastet man sich bei den anderen Elementen vorsichtig vor, Schritt für Schritt. Bei der Informationsverarbeitung herrscht die Meinung vor, dass ein Sprung ins kalte Wasser eine gute Idee ist und gibt sich gleich das volle Programm.

    Auf YouTube sah ich gestern ein alternatives "Ende" einer solchen Taucher-Geschichte. Ein Kurzfilm: Absprung Boot bis Tod waren 6 Minuten, wenn ich mich recht entsinne. Die Kamera hat's überlebt.

    Genauso, wie ich es vermeiden würde, einen Anfänger bei einen schweren Tauchgang als Buddy zu haben, würde ich vermeiden, jemanden im Team zu haben, der OOP kann, aber nicht in der Lage ist, ohne OOP sauber zu arbeiten.

    Ich schreibe meine Algorithmen jetzt bevorzugt generisch. Zuvor habe ich mich mit Basic, Assembler und C versaut.
    Seit 21 Jahren programmiere ich, grade mal 9 Jahre davon in C++.
    Was den C-Style angeht: Ich habe vor C++ OOP in C programmiert und mir dann ein Buch über C++ gekauft. Dort las ich dann, dass es für meinen C-Style in C++ passende Schlüsselwörter gibt.

    Was das Umstellen angeht: C ist in C++ enthalten. Konzepte, die man in C gelernt hat, werden in C++ nicht falsch, nur weil C++ alternative Konzepte anbietet.

    KasF schrieb:

    Naja jeder sollte die für sich beste Methode auswählen, um sein Ziel zu erreichen und wenn du mit deinem Methoden Erfolg hast, dann sag ich dagegen auch nichts 😉 ( nur das ich es nicht so machen würde 🙂 ).

    Welche Methode für einen Anfänger am Besten ist, muss er entscheiden anhand der Informationen, die er von Menschen bekommt, die einen großen Überblick haben. Die Menschen mit dem großen Überblick vergessen dabei, dass sie sich den über Jahre angeeignet haben.

    Mein erster Versuch C zu lernen scheiterte daran, dass ich den Compiler nicht überredet bekam, meinen Sourcecode zu kompilieren. Ich weiß nicht, ob der Code Fehler hatte, der Compiler verstand mich nicht und begann gar nicht erst zu kompilieren.
    Bei dem Level starten die meisten.



  • Hallo

    Also ehrlich gesagt, würde ich nicht erst c und dann c++ lernen, sondern gleich mit c++ anfangen. Ist imho einfacher zuverstehen. Gerade was strings und arrays (vectoren) angeht. Ob das in der Implementierung auf c-Sachen zutückgeht, kann mir ja erstmal egal sein und sollte mich erst später interessieren.

    chrische



  • Xin schrieb:

    Was den C-Style angeht: Ich habe vor C++ OOP in C programmiert und mir dann ein Buch über C++ gekauft. Dort las ich dann, dass es für meinen C-Style in C++ passende Schlüsselwörter gibt.

    Ich würde gerne wissen wie man in C (Ansi C) wirklich OOP betreiben kann.
    Ja, man kann quasi einen this-Zeiger emulieren; Aber was ist mit Zugriffsmodifikatoren (public/protected/private) und alles was über das einfache Klassenkonzept hinausgeht?

    Wenn du kein Problem mit Umstieg C => C++ hattest, und wirklich Objektorientiert programmierst, dann Hut ab. Ich kenne extrem viele Negativbeispiele die im wesentlichen C in Klassen verpacken und dies C++ und OOP nennen.

    Xin schrieb:

    Was das Umstellen angeht: C ist in C++ enthalten. Konzepte, die man in C gelernt hat, werden in C++ nicht falsch, nur weil C++ alternative Konzepte anbietet.

    C++ ist nicht C (Und ja, etwas was im C99 Standard ist kann im C++98 Standard falsch sein), auch wenn es darauf aufbaut. Und ja, man kann auch weitgehend C unter C++ schreiben. Aber C++ ist weit mehr (Multiparadigmensprache).

    Ich würde jeden Heute erst zu C++ raten wenn er C++ entwickeln will. Die Denkmuster sind anders. Zudem kann man dann noch immer sich Richtung C umschauen - doch in der Art der Entwicklung unterscheiden sich die Sprachen.

    Zumal C++ weit mehr als nur OOP+C ist den es beinhaltet u.a.:
    - Prozedurale Elemente (von C geerbt)
    - Objektorientierte Elemente
    - STL (Templatebasierende Programmierung)
    - Templatemetaprogrammierung

    cu André



  • Nachtrag: Wenn ich ein Haus bauen müsste würde mich der Prozess wie die Ziegel nun hergestellt werden auch nicht im ersten Moment interessieren...



  • asc schrieb:

    Zumal C++ weit mehr als nur OOP+C ist den es beinhaltet u.a.:
    - Prozedurale Elemente (von C geerbt)
    - Objektorientierte Elemente
    - STL (Templatebasierende Programmierung)
    - Templatemetaprogrammierung

    cu André

    und das (meiner meinung nach wichtigste):elemente der funktionalen programmierung

    Das Problem beim Umstieg von C nach C++ ist, dass viele das gefühl kriegen: C++ ist C mit Klassen, und das ist falsch.



  • chrische5 schrieb:

    Gerade was strings und arrays (vectoren) angeht. Ob das in der Implementierung auf c-Sachen zutückgeht, kann mir ja erstmal egal sein und sollte mich erst später interessieren.

    Vectoren sind keine Arrays und es wird Dir auch weiterhin egal sein.
    Wenn Du was optimieren musst, wärst Du dankbar, Du wüsstest es.

    chrische5 schrieb:

    Wenn ich ein Haus bauen müsste würde mich der Prozess wie die Ziegel nun hergestellt werden auch nicht im ersten Moment interessieren...

    Nicht alles, was hinkt ist ein Vergleich. Ein A380-Pilot muss das Flugzeug auch nicht herstellen, aber trotzdem kleinere Flugzeuge fliegen können.
    Als Häusle-Bauer wirst Du erst kleine Häuser bauen, bevor Du die Petronas-Towers nachbaust.

    Mach Dir nichts draus, ein Versuch war's wert. ;-D

    asc schrieb:

    Xin schrieb:

    Was den C-Style angeht: Ich habe vor C++ OOP in C programmiert und mir dann ein Buch über C++ gekauft. Dort las ich dann, dass es für meinen C-Style in C++ passende Schlüsselwörter gibt.

    Ich würde gerne wissen wie man in C (Ansi C) wirklich OOP betreiben kann.
    Ja, man kann quasi einen this-Zeiger emulieren; Aber was ist mit Zugriffsmodifikatoren (public/protected/private) und alles was über das einfache Klassenkonzept hinausgeht?

    Entscheide Dich, möchtest Du Zugriffbeschränkungen in C nachbilden oder OOP.

    Der this-Zeiger ist vollkommen uninteressant für OOP, er ist nur ein Funktions-Parameter, der vor die Funktion gerutscht ist. Interessant ist bei OOP ausschließlich das Schlüsselwort 'virtual'.

    "Protected" kann man in C nicht nachbilden. Eine große Errungenschaft der Sprache C++, die man als Anfänger ungefähr genauso dringend benötigt wie 'virtual'.

    asc schrieb:

    Xin schrieb:

    Was das Umstellen angeht: C ist in C++ enthalten. Konzepte, die man in C gelernt hat, werden in C++ nicht falsch, nur weil C++ alternative Konzepte anbietet.

    C++ ist nicht C (Und ja, etwas was im C99 Standard ist kann im C++98 Standard falsch sein), auch wenn es darauf aufbaut.

    Okay... hier kommen Details unterschiedlicher Standards ins Spiel...

    asc schrieb:

    Und ja, man kann auch weitgehend C unter C++ schreiben. Aber C++ ist weit mehr (Multiparadigmensprache).

    Ich würde jeden Heute erst zu C++ raten wenn er C++ entwickeln will. Die Denkmuster sind anders. Zudem kann man dann noch immer sich Richtung C umschauen - doch in der Art der Entwicklung unterscheiden sich die Sprachen.

    Zumal C++ weit mehr als nur OOP+C ist den es beinhaltet u.a.:
    - Prozedurale Elemente (von C geerbt)
    - Objektorientierte Elemente
    - STL (Templatebasierende Programmierung)
    - Templatemetaprogrammierung

    ...und nun kommt die STL und Templates dazu.

    Wir erinnern uns an das zu lösende Problem: Jemand möchte in die Programmierung einsteigen. Dazu braucht man auf jeden Fall Templates und die STL und muss die einzelnen Standards erstmal auswendig lernen.

    Alternativ könnte er erstmal einfach lernen, welche Operatoren es gibt, wie man if, while und rekusive Funktionen verwendet und wie man überhaupt eine Funktion schreibt, bevor man sie Methode nennt.



  • otze schrieb:

    asc schrieb:

    Zumal C++ weit mehr als nur OOP+C ist den es beinhaltet u.a.:
    [...]

    und das (meiner meinung nach wichtigste):elemente der funktionalen programmierung

    Hier kommt echt keiner auf die Idee, dass Anfänger erstmal grundlegende Dinge wie "if" lernen sollten, oder?

    Gibt's vielleicht mal jemanden neben mir, der schonmal unterrichtet hat, der dazu mal was sagen würde?
    Mir scheint, dass hier jeder mit "Einstieg" ein Informatik-Studium gleichsetzt...

    otze schrieb:

    Das Problem beim Umstieg von C nach C++ ist, dass viele das gefühl kriegen: C++ ist C mit Klassen, und das ist falsch.

    C++ hat seinen Namen nicht von Stroustrup, der nannte es zunächst "C mit Klassen". Was sich der blöde Stroustrup wohl dabei gedacht hat?! Wie gut, dass wir es heute besser wissen.

    Hier kann offenbar jeder C++ und weiß, dass man in C nur Scheiße programmieren kann. Aber anscheinend kann niemand soviel C, um das beurteilen zu können.

    Man programmiert OOP anders als Prozedural.
    Und das gilt für C und C++ gleichermaßen. C++ vereinfacht OOP deutlich und da ist der Unterschied.



  • ...

    Xin schrieb:

    Als Pilot sollte ich erst den A380 fliegen und dann verstehe ich auch, wie ein Sportflugzeug funktioniert.
    Ich fahre zuerst die Regatta und dann verstehe ich, wie man auf'm Baggersee eine Nußschale bewegt.
    Ich mache erst den Führerschein für Schwertransporter, dann verstehe ich auch so, wie man einen PKW fährt.

    Ich bin Sporttaucher. Als Anfänger sollte man erstmal Bergungstauchgänge in 40m tief gelegenen Höhlen machen. Dann versteht man auch, wie man in 5 Metern Tiefe taucht...

    Ich sag nur: Äpfel und Birnen ...

    Xin schrieb:

    Hier kommt echt keiner auf die Idee, dass Anfänger erstmal grundlegende Dinge wie "if" lernen sollten, oder?

    Naja... Irgendwas aus der Luft gegriffen. Hat hier irgendjemand etwas dergleichen behaupten?

    Schonmal dran gedacht das "if etc." auch C++ ist und nicht nur C.



  • Xin schrieb:

    asc schrieb:

    Wenn ich ein Haus bauen müsste würde mich der Prozess wie die Ziegel nun hergestellt werden auch nicht im ersten Moment interessieren...

    Nicht alles, was hinkt ist ein Vergleich. Ein A380-Pilot muss das Flugzeug auch nicht herstellen, aber trotzdem kleinere Flugzeuge fliegen können...

    Wenn mein Vergleich hinkt, ist deiner auch nicht besser.

    Les dir bitte durch aus welchen Sprachkonstrukten C++ besteht. Ich muss nicht unbedingt einen Anfänger noch den Aufwand raten vorher ein C Buch zuzulegen, um dann Konstrukte die unter C sinnvoll, oder C++ aber ersetzt wurden (vergleiche mal bitte alleine die 2 Standardbibliotheken) zu lernen.

    Xin schrieb:

    Als Häusle-Bauer wirst Du erst kleine Häuser bauen, bevor Du die Petronas-Towers nachbaust.

    Und wo wiederspricht das wenn er gleich C++ lernt? C++ unterstützt auch das, dazu muss er weder die typische Herangehensweise von C noch deren Bibliotheken lernen.

    Xin schrieb:

    Mach Dir nichts draus, ein Versuch war's wert. ;-D

    Stimmt, netter Versuch deinerseits.

    Xin schrieb:

    Entscheide Dich, möchtest Du Zugriffbeschränkungen in C nachbilden oder OOP.

    Entweder hast du keine Ahnung von Objektorientierung, oder dir ist bekannt das Datenkapselung, und damit verbundene Zugriffseinschränkungen ebenso zu OOP dazugehören ("virtual" ist nur ein winziger Teil von OOP). Und z.B. "protected" hat sehr viel Sinn (Weiterreichen von Sachen die nur in der Vererbungshierachie zugreifbar sein dürfen; Sonst müsste man es public machen und dann kann die Schnittstelle wieder gänzlich falsch verwendet werden). C++ erlaubt eine sauberere Programmierung, da du mehr Mittel und Wege hast die falsche Anwendung von Code einzuschränken. Zudem möchte ich die bessere Typprüfung auch nicht missen.

    Xin schrieb:

    ...und nun kommt die STL und Templates dazu.

    Wir erinnern uns an das zu lösende Problem: Jemand möchte in die Programmierung einsteigen. Dazu braucht man auf jeden Fall Templates und die STL und muss die einzelnen Standards erstmal auswendig lernen.

    Die STL gehört ebenso dazu, wie unter C deren Standardbibliotheken. Wenn du die STL ausklammern willst (wozu auch iostreams etc. zählt), verlange ich von dir das du unter C ohne die Standardbibliotheken (printf&co...) auskommst. Und der Stil der in den C-Bibliotheken verwendet ist mag in Teilen effektiver sein (was übrigens dank statischer Typprüfung und Templates unter C++ nicht unbedingt immer der Fall ist).

    Und auch Templates in einfachen Formen können durchaus schon früh Sinn machen, hier geht es weder um Templatemetaprogrammierung noch Template-Templateparameter etc.

    Xin schrieb:

    Alternativ könnte er erstmal einfach lernen, welche Operatoren es gibt, wie man if, while und rekusive Funktionen verwendet und wie man überhaupt eine Funktion schreibt, bevor man sie Methode nennt.

    Dagegen sprechen die wenigsten C++ Bücher etwas. Aber sie verwenden (wenn sie den sinnvoll geschrieben sind) z.B. nicht die C-Bibliotheken. Du möchtest als Anfänger ja nicht unbedingt zweimal lernen.

    Und if, while... ist ebenso C++

    Zudem: B.S. hat tatsächlich C++ anfangs C mit Klassen genannt. ABER ziehe dann bitte auch seine aktuellen Standpunkte zur Sprache hinzu und zitiere nicht aus der C++ Entstehungsgeschichte. Du sprichst doch von Evolution, also berücksichtige sie auch.

    cu André



  • asc schrieb:

    Xin schrieb:

    Entscheide Dich, möchtest Du Zugriffbeschränkungen in C nachbilden oder OOP.

    Entweder hast du keine Ahnung von Objektorientierung, oder dir ist bekannt das Datenkapselung, und damit verbundene Zugriffseinschränkungen ebenso zu OOP dazugehören ("virtual" ist nur ein winziger Teil von OOP).

    virtual ist nicht "nur ein winziger Teil von OOP", virtual ist OOP.
    Weder Datenkapselung noch Klassen sind für OOP nicht erforderlich. Schau Dir mal die Implementierung von "virtual" und überlege Dir, warum OOP nicht "datengekapselte-Programming" oder "klassenbasierte Programming" oder "Datenvererbende Programming" heißt.
    Soll ich's kurz machen? Es ist uninteressant, und außer "virtual" wirst Du in C++ nix finden, was mit OOP zu tun hätte.

    Wer sich jetzt berufen fühlt, groß aufzuschreien - und das werden viele sein - sollte vielleicht nicht nur "Fachliteratur" wie den Informatik-Duden und Wikipedia-Artikel lesen, sondern sich mal tiefergehend damit beschäftigen. "Die C++Programmiersprache" ist das Buch für die Frage "Wie?", "Design und Entwicklung von C++" ist das Buch, dass das "Warum?" beschreibt. Welches von beiden hast Du gelesen, schließlich hast Du ja schnell rausgefunden, dass ich keine Ahnung habe.

    Wenn es also darum geht, das allgemeine Geblubber zu dem Thema wiederzukäuen (das man häufig auch an Hochschulen hört), so stimme ich Dir zu: Ich habe keine Ahnung von Objektorientierung.

    asc schrieb:

    Xin schrieb:

    Wir erinnern uns an das zu lösende Problem: Jemand möchte in die Programmierung einsteigen. Dazu braucht man auf jeden Fall Templates und die STL und muss die einzelnen Standards erstmal auswendig lernen.

    Die STL gehört ebenso dazu, wie unter C deren Standardbibliotheken. Wenn du die STL ausklammern willst (wozu auch iostreams etc. zählt), verlange ich von dir das du unter C ohne die Standardbibliotheken (printf&co...) auskommst.

    Von mir kannst Du verlangen was Du willst. Mir würde es schon reichen, wenn Du begreifst, dass jemand in die Programmierung >> einsteigen << will...

    EDIT: Das bedeutet - ich schreibe es extra nochmals hin - dass es nicht darum geht, die tollste Sprache zu finden, sondern einen Kompromiss zwischen Erlernbarkeit und Nutzen für die Zukunft zu finden. Es ist also nicht erforderlich hier aufzuzählen, dass C++ so toll ist - ich kenne die Sprache schon - sondern eine Lösung zu finden, die dem Fragenden hilft. Ein Schwanzvergleich zwischen C und C++ hilft ihm nicht. Eine übersichtlichere Teilmenge von C++ zu lernen hilft ihm vermutlich eher, als von den vielen Möglichkeiten von C++ erschlagen zu werden.

    asc schrieb:

    Zudem: B.S. hat tatsächlich C++ anfangs C mit Klassen genannt. ABER ziehe dann bitte auch seine aktuellen Standpunkte zur Sprache hinzu und zitiere nicht aus der C++ Entstehungsgeschichte. Du sprichst doch von Evolution, also berücksichtige sie auch.

    ...zu verstehen, dass ich es nicht bin, wäre aber auch ein Anfang.

    Du möchtest, dass die Evolution berücksichtigt wirst? Das ist ja genau das, was ich auch möchte und gegen dass Du Dich wehrst.
    Damit sind wir uns ja eigentlich einig.

    EDIT: D.h. ich habe keine Lust mehr. Du hast Deine Meinung gesagt, ich meine, der Fragesteller wird vermutlich schon PureBasic lernen, weil er sich denkt, dass C oder C++ schon nix sein kann, wenn nichtmals die (aus seiner Sicht) Profis wissen, was sie da tun.



  • Xin schrieb:

    ...und außer "virtual" wirst Du in C++ nix finden, was mit OOP zu tun hätte.

    klassen. irgendwo müssen die objekte ja herkommen...
    🙂



  • Xin schrieb:

    Soll ich's kurz machen? Es ist uninteressant, und außer "virtual" wirst Du in C++ nix finden, was mit OOP zu tun hätte.
    ...
    Wer sich jetzt berufen fühlt, groß aufzuschreien - und das werden viele sein - sollte vielleicht nicht nur "Fachliteratur" wie den Informatik-Duden und Wikipedia-Artikel lesen, sondern sich mal tiefergehend damit beschäftigen...

    Ich glaube ich brauche mit dir wirklich nicht zu diskutieren, es ist ebenso sinnlos wie einigen zu Erlären das die Verwendung einer Klasse nicht automatisch OOP ist.

    Und zur "tiefgreifenden Beschäftigung" mit der Materie:
    Ich mag vermutlich nicht ganz so alt sein wie du es bist (ich bin nur 30), und mich auch noch nicht solange mit Programmierung und Softwareentwicklung beschäftigen (nur etwa 17 Jahre bzw. nur etwa 11 Jahre seit ich Beruflich damit zu tun habe), und ich habe auch kein abgeschlossenes Studium wo ich anderen sagen kann: Ich weiß die Ultimative Lösung.

    Ich weiß das ich nicht allwissend bin und ich lerne stetig hinzu (ebenso wie meine Literatur stetig anwächst, auch wenn du recht hast: letztgenanntes Buch habe ich wirklich nicht) und ich merke noch heute jede Woche das es immer noch Dinge gibt die es zu lernen gibt. Aber ich betrachte nicht alleine C++ sondern auch Bücher die sich um Softwareentwurf (verschiedene Paradigmen), und im Speziellen um Objektorientierung und UML drehen [Und ja, auch ich habe mit der prozeduralen Programmierung angefangen].

    Ich kenne auch die Entwicklung von C++ und auch das es sehr klein angefangen hat (grade was OOP angeht) und noch immer in der Weiterentwicklung ist.

    Aber die Objektorientierung auf virtuel zu begrenzen, ja, da nehme ich mir heraus zu sagen das du keine Ahnung von OOP hast.

    cu André



  • pale dog schrieb:

    Xin schrieb:

    ...und außer "virtual" wirst Du in C++ nix finden, was mit OOP zu tun hätte.

    klassen. irgendwo müssen die objekte ja herkommen...
    🙂

    Nopes, sorry, better luck next time. ^^

    Structs oder Arrays reichen vollkommen.



  • Xin schrieb:

    pale dog schrieb:

    Xin schrieb:

    ...und außer "virtual" wirst Du in C++ nix finden, was mit OOP zu tun hätte.

    klassen. irgendwo müssen die objekte ja herkommen...
    🙂

    Structs oder Arrays reichen vollkommen.

    siehste, dann hat c++ schon 3 OOP features 😉



  • Weis ja nicht, ob das diskutieren mit Xin soviel sinn hat.

    Ja, es ist richtig dass man zuerst if lernen muss, aber dafür brauch man beileibe kein C buch für. Aber bevor man sich mit den CStrings, printf und dynamischen arrays rumschlägt, kann man gleich std::string, std::vector und die iostreams verwenden. Und wenn man früh lernt, dass man probleme mit den stl algorithmen lösen kann, dann ist man auch ein großes stück weiter und lernt gleichzeitig ein paar wichtige Sachen über die Art, wie man heutzutage C++ programmiert.

    Btw: 2 der 3 oben genannten Klassen benutzen nichtmal virtual in irgendeiner Form. Da dies aber scheinbar keine OOP nach deiner definition ist, aber ein unbestritten wichtiger bestandteil von C++, wankt deine Theorie C++ = C mit Klassen mal ganz stark. QED. Übrigens könnte man das auch meinen, weil C++ eben nicht C mit Klassen heisst. Und wenn man sich anschaut, was in den nächsten Standard alles reingenommen wird weil es nötig erscheint, und das alles keine OOP features sind, kommt man auch ins Grübeln, und Stroustrup macht da sogar ordentlich mit 😉

    und zuguter letzt: OOP!= vererbung. Es kommt einzig und allein darauf an, dass man daten und methoden die zusammengehören zusammenschriebt. Die C filestreams sind zb gute oop, nur dass es dort das class schlüsselwort nicht gibt.



  • asc schrieb:

    Xin schrieb:

    Soll ich's kurz machen? Es ist uninteressant, und außer "virtual" wirst Du in C++ nix finden, was mit OOP zu tun hätte.
    ...
    Wer sich jetzt berufen fühlt, groß aufzuschreien - und das werden viele sein - sollte vielleicht nicht nur "Fachliteratur" wie den Informatik-Duden und Wikipedia-Artikel lesen, sondern sich mal tiefergehend damit beschäftigen...

    Ich glaube ich brauche mit dir wirklich nicht zu diskutieren, es ist ebenso sinnlos wie einigen zu Erlären das die Verwendung einer Klasse nicht automatisch OOP ist.

    Das würde nicht viel bringen, da ich bereits vorher gesagt habe, dass ausschließlich "virtual" OOP ist. Von Klassen habe ich nichts gesagt, die brauchst Du für OOP auch nicht.

    asc schrieb:

    Und zur "tiefgreifenden Beschäftigung" mit der Materie:
    Ich mag vermutlich nicht ganz so alt sein wie du es bist (ich bin nur 30), und mich auch noch nicht solange mit Programmierung und Softwareentwicklung beschäftigen (nur etwa 17 Jahre bzw. nur etwa 11 Jahre seit ich Beruflich damit zu tun habe), und ich habe auch kein abgeschlossenes Studium wo ich anderen sagen kann: Ich weiß die Ultimative Lösung.

    So alt bin ich auch noch nicht, auch erst 30.
    Ich habe aber schon mehrfach C/C++ unterrichtet und Compilerbau und Sprachdesign zog sich als roter Faden durch mein Studium. Ich kenne einiges an Literatur dazu und schreibe selbst einen Compiler.
    Anders ausgedrückt: Das hier ist exakt das Thema, in dem man sehr schwer Argumente finden wird, die ich noch nicht kenne. Diskutier mir mit über OpenGL, da habe ich im großen ganzen keinen Plan von, das erhöht Deine Chancen mit Halbwissen Recht zu bekommen erheblich.

    asc schrieb:

    Ich weiß das ich nicht allwissend bin und ich lerne stetig hinzu (ebenso wie meine Literatur stetig anwächst, auch wenn du recht hast: letztgenanntes Buch habe ich wirklich nicht)

    War zugegebenermaßen ein Totschlagargument. Das Buch kennt keine Sau, aber die wenigsten wollen auch wissen, warum C++ so ist, wie es ist.

    Das Buch wird von AW nicht mehr verlegt, es ist auch keine Neuauflage geplant. Ich habe meins bei EBay gekauft, nach 6 Monaten Suche, verkaufte mal jemand ein Exemplar.
    Es ist allerdings auch nicht mein Job, jemandem der es offenbar besser als ich weiß, Informationen zuzuspielen.

    Informatiker sind diejenigen, die das "Warum?" ihrer Werkzeuge am wenigsten hinterfragen. Es ist da, es tuts, ich weiß nicht warum, aber solange ich so Geld verdiene ist doch alles im Butter.

    asc schrieb:

    Ich kenne auch die Entwicklung von C++ und auch das es sehr klein angefangen hat (grade was OOP angeht) und noch immer in der Weiterentwicklung ist.

    Aber die Objektorientierung auf virtuel zu begrenzen, ja, da nehme ich mir heraus zu sagen das du keine Ahnung von OOP hast.

    Aufgrund der vorherigen Auskunft lernbereit zu sein, testen wir das doch mal an und ignorieren die Zuschreibung besonderer Kompetenz. ^^

    Den Fehler, den die meisten Programmierer machen ist, dass sie glauben, in C könnte man nicht OOP programmieren, in C++ schon. Daraus wird geschlussfolgert, dass das, was C++ mehr kann, das ist, was OOP ausmacht.
    Weil die Leute nicht wissen, wie es wirklich funktioniert, mystifizieren sie es und machen da irgendwas großes, tolles, wichtiges draus. Weiterhin ist OOP ein Marketing-Begriff. OOP ist modern. Die Programme werden aber trotzdem nach Assembler kompiliert, es steckt keine Magie dahinter.

    Objektorientierte Programmierung bedeutet, dass Du ein Datenobjekt hast - und das muss keine Klasse sein, es reicht vollkommen aus, wenn es einfach nur ein paar Bytes hintereinander sind - und dieses Datenobjekt führt die Information mit sich, was es ist, also zum Beispiel Dreieck oder Rechteck.

    Das wird in der Regel so realisiert, dass das Objekt einen zusätzlichen Zeiger auf die Typinformation bekommt. In C++ wird dieser Zeiger mitgegeben, sobald die erste virtuelle Funktion ins Spiel kommt. Wenn Dein Compiler also meldet, dass er nicht weiß, wo er die vtable unterbringen soll, dann ist das genau diese Typinformation, der GCC koppelt sie an den Destruktor. Virtuelle Funktionen ohne Destruktor gibt Ärger.
    Das kannst Du leicht testen, in dem Du sizeof() für eine Klasse ohne virtuelle Funktion aufrufst und ein sizeof() mit beliebig vielen virtuellen Funktionen. Das Objekt mit virtuellen Funktionen enthält nicht mehr Daten ist aber genau eine Zeigerlänge größer (also i.d.R. 4 bzw. 8 Byte).

    Überlädst Du eine Funktion, so wird die Funktion aufgerufen, entsprechend ihres Datentyps.

    class Figur
    {
      double GetAreaSize();
      virtual double GetAreaSize_virtual();
    };
    
    class Rect : public Figur { ... };
    class Triangle : public Figur { ... };
    

    Hast Du eine nun eine Variable vom Typ Rect in einem Zeiger vom Typ Figur und rufst GetAreaSize() so wird Figur::GetAreaSize() gerufen. Das ganze ist statisch an den Datentyp geknüpft.

    Rufst Du GetAreaSize_virtual(), so wird auch Figur::GetAreaSize_virtual() gerufen. In dem Fall wird allerdings der Funktionsaufruf über die Typinformation geleitet. Die Typinformation enthält ein Array mit Funktionszeigern für alle virtuelle Funktionen. Der Datensatz enthält hier einen Zeiger auf die Typinformation "Rect" und dort steht auch, wo die Funktion Figur::GetAreaSize_virtual() zu finden ist. Darum ist der Ruf von virtuellen Funktionen auch immer teurer als von statischen.

    Für den Datensatz - das Objekt - vom Typ "Rect" zeigt dieser Funktionszeiger also woanders hin als, als wäre es ein Objekt vom Typ "Triangle". Der Funktionsaufruf ist nicht statisch, sondern vom Objekttyp abhängig, anders ausgedrückt: Objekt orientiert.

    Das ist objektorientierte Programmierung. Das wars, mehr ist es nicht.

    Vererbung ist ein ganz anderes Konzept, das funktioniert auch auch bei statischen Überladungen. Das gleiche gilt für Data-Hiding. Das hat alles mit OOP nichts zu tun, sondern sind vollkommen statische Techniken.

    Ich mag zwar keine Ahnung haben, aber Du kannst das bei Bedarf bei Stroustrup nachlesen. Wie wir bei "C mit Klassen" festgestellt haben, hat der aber auch keine Ahnung.

    Ich muss ganz ehrlich sagen, wenn das ganze Forum der Meinung ist, dass ich keine Ahnung habe, dann habe ich da kein Problem mit. Ich lese ja auch nicht die Bildzeitung.



  • Wenn jemand C++ lernen will, dann will er auf eine bestimmte Art und Weise ein Problem lösen. Und dann soll er/sie auch C++ und nicht C lernen. Ganz einfach. Denn letztendlich ist das Erlernen von C für C++ völlig nutzlos. Denn wenn ich jemandem C beibringe, bringe ich ihm eine bestimmte Philosophie des Denkens und Programmierens bei. Und das ist nich das gleiche Ziel wie C++. C++ wurde entwickelt, weil man mit der Denkweise und Programmierung von C nicht einverstanden war, um ein Problem zu lösen. Hätte Stroustrup damals mit C voll und ganz zufrieden sein können für seine Problem, hätte er nicht C++ entwickelt. Er hat einen Bedarf festgestellt, den C nicht abdecken kann.

    Das C zum großen Teil (noch nicht mal 100%!) in C++ steckt, ist ein reiner Marketinggag. Weil man damit die C'ler mit ihren Projekten nach C++ locken konnte. Also eine Migration erleichtert hat. Mehr auch nicht. Und sind wir ehrlich, der Trick hat funktioniert. 👍

    Wenn jemand fragt "Wie kann ich C++ lernen?" ist es einfach falsch zu sagen "Lern C!". Das ist NICHT die Antwort die er hören wollte und soll. Wenn jemand wissen will, wie man Brötchen backt, sage ich ihm auch nicht "Ich gib dir ein Backrezept wie man ein Brot backt.". Was ist das für eine Hilfe? Keine!



  • Artchi schrieb:

    ...man damit die C'ler mit ihren Projekten nach C++ locken konnte. Also eine Migration erleichtert hat. Mehr auch nicht. Und sind wir ehrlich, der Trick hat funktioniert.

    das glaubst aber nur du 😃



  • Artchi schrieb:

    Hätte Stroustrup damals mit C voll und ganz zufrieden sein können für seine Problem, hätte er nicht C++ entwickelt. Er hat einen Bedarf festgestellt, den C nicht abdecken kann.

    Ähhh... auch hier muss etwas einspruch erheben.

    Er schrieb ein Projekt in Simula, doch das war zu langsam, also wollte er es in C neu schreiben. OOP ist in C aber nicht so schön, also schrieb er Makros. Um das nochmals zu verdeutlichen, er schrieb Makros, nicht "C mit Klassen". Das Projekt nannte sich Cfront und wurde über Jahre gepfegt. Die ersten C++-Programme wurden mit C-Compilern kompiliert. Anders ausgedrückt: C wurde dem Bedarf gerecht.
    Nach etwa 5 Jahren Cfront, entstand der erste "C mit Klassen"-Compiler, der zu C++ umbenannt wurde.

    Artchi schrieb:

    Das C zum großen Teil (noch nicht mal 100%!) in C++ steckt, ist ein reiner Marketinggag. Weil man damit die C'ler mit ihren Projekten nach C++ locken konnte. Also eine Migration erleichtert hat. Mehr auch nicht. Und sind wir ehrlich, der Trick hat funktioniert. 👍

    Interessante Formulierung.
    C ist zum großen Teil in C++, wenn auch nicht zu 100%, ist kein Marketing-Gag, sondern eine Tatsache. Die Begründung ist allerdings korrekt, war allerdings kein als Trick gedacht, sondern als Einladung, so dass man Schritt für Schritt auf C++ wechseln konnte.

    Artchi schrieb:

    Wenn jemand fragt "Wie kann ich C++ lernen?" ist es einfach falsch zu sagen "Lern C!". Das ist NICHT die Antwort die er hören wollte und soll.

    Hier drehen wir uns im Kreis. Du gehörst zu den Leuten, die eine Anfänger mit Möglichkeiten erschlagen und ich gebe ihnen einen Laufstall, wo sie laufen lernen. Danach können sie immernoch zu C++ wechseln.
    Was sich innerhalb einer Klasse abspielt ist nahezu reines C.

    Ich denke, meine Methode zu unterrichten war recht erfolgreich und effektiv, das wurde mir von den Studenten auch so bestätigt.


Anmelden zum Antworten