# Findet ihr C++ auch kompliziert?



## ChrisX (31. Jan 2012)

Hi,

ich habe mal wieder etwas versucht mich in C++ einzuarbeiten und ich finde es schon ziemlich kompliziert, die ganzen unterschiedlichen Konstruktoren, Templates, Boost usw. Ich habe auch das Buch Effektive C++ wo nochmal 55 Tips gegeben werden wie man seine Konstrukte so anlegen sollte. 

Ich kann mir nicht helfen ich finde es echt schwierig da durchzublicken und das Aufteilen in Header und Cpp ist auch sehr anstrengend.

Hat jemand ähnliche Erfahrungen gemacht oder bin ich doch der einzige der zu blöd für C++ ist???:L

Gruß Chris


----------



## Fab1 (31. Jan 2012)

Musst du denn C++ lernen? Wenn du bereits Java kannst warum möchtest du dann umsteigen?

Sicherlich ist C++ nicht die einfachste Sprache, jede Sprache hat seine Besonderheiten C++ eben ein paar mehr.

Der Einzigste bist du sicherlich nicht, da kann ich dich beruhigen. Vor dir haben noch Tausende andere an C++ versagt. 

Die Antwort ist jetzt sicherlich nicht sehr hilfreich, allerdings weiß ich auch nicht was du damit in einem Java Forum erreichen möchtest.


----------



## ChrisX (31. Jan 2012)

Ne, ich möchte nicht umsteigen. Ich habe nur versucht noch eine andere Sprache zu erlernen und obwohl ich noch mittendrin beim Java lernen bin, habe ich dennoch immer mal wieder versucht mit C++ warm zu werden. Alle paar Jahre versuche ich es erneut und gebe dann doch wieder auf.

Ich wollte eigentlich nur mal wissen, ob es nur mir so erging und warum vielleicht auch andere aufgegeben haben.


----------



## jDennis79 (31. Jan 2012)

Ich starte immer mal wieder einen Anlauf und gebe dann doch regelmäßig wieder auf. Wobei ich die Sprache an sich bis zu dem Punkt, zu dem ich gekommen bin, nicht komplizierter finde als Java. Aber die Lernkurve ist mir einfach zu flach. Es nervt mich, dass ich subjektiv keinen Lernfortschritt sehe.


----------



## MasterK (31. Jan 2012)

Wieder mal C++, ja? 

Meine Erfahrung: Java Entwickler tun sich beim Umstieg auf C++ deutlich schwerer als umgekehrt.

Das ganze liegt wohl daran, dass vieles bei C++ auf den ersten Blick ähnlich wie in Java aussieht und heisst (Klassen, Klammern, private/protected/public, Variablenbezeichner, Aufbau der Methoden, generell Schlüsselwörter), der Teufel aber im Detail steckt. Und dann stolpern Java Entwickler eben darüber, dass es einen Unterschied zwischen Pointern und Referenzen gibt, dass es (echte) Copy-Konstruktoren gibt die je nach Umstand automatisch aufgerufen werden, dass es Zuweisungsoperatoren und Destruktoren gibt. Dass es durchaus einen Unterschied macht, ob ich Sachen auf den Stack oder auf den Heap lege (was natürlich echte Vorteile hat, das unsägliche try-with-resources habe ich da ja schon mehrfach erwähnt) und dass man aufpassen muss, dass man keine Adressen auf Objekte zurückliefert die auf dem Stack liegen.

Und das alles ist ja erst der Anfang. Habe ich auf Arbeit mehrfach erlebt, wie Java Entwickler ein C++ Programm geschrieben haben und wir dann gemeinsam auf Fehlersuche gegangen sind. Letztendlich ist es nahezu immer ein Fehler, der schlichtweg mangels Kenntnissen passierte.

Das sollte man sich klarmachen, wenn man als Java Entwickler C++ lernen möchte: Auch wenn es auf den ersten BLick ähnlich aussieht, es ist eine andere Sprache mit einen Techniken, die alle ihre Berechtigung haben, die man aber nicht einfach so aus Java heraus ableiten kann.


----------



## HimBromBeere (31. Jan 2012)

Also ich bin von C++ auf Java umgestiegen und fand letzteres auch deutlich einfacher und v.a. anschaulicher. V.a. die Sache mit Referenzen und Zeigern ist bei C++ schwierig. Aber C++ hat durchaus seine Vorteile.

Die Aufteilung von Header und Class finde ich aber durchaus sinnvoll. Das ist doch nichts anderes, als wenn du in Java ein Interface erstellst und dann Klassen, die dieses Interface implementieren, also in der einen Datei definierst du, was ein Objekt kann und in der anderen Datei sagst du, wie das geht.


----------



## ChrisX (31. Jan 2012)

@MasterK:
Ja, genau die Sachen du die erwähnt hast lassen mich immer wieder aufgeben. Ich verstehe ja den Sinn hinter den ganzen Techniken und auch mit Pointer, Referenzen habe ich keine großen Probleme, wenn sie nicht all zu komplex sind. Es gibt da sooo viele Fehler die man machen kann um sein Programm dann im Endeffekt total uneffektiv zu implementieren, dass ich einfach die Lust verlieren auch nur das einfachste Programm mit ein paar Klassen zu schreiben.

Ich denke mir dann immer, falls ich wirklich mal was Systemnahes oder ganz Schnelles brauche, kann ich das auch per JNI und C erledigen und schon bin ich dann doch wieder bei Java gelandet.


----------



## ChrisX (31. Jan 2012)

HimBromBeere hat gesagt.:


> Also ich bin von C++ auf Java umgestiegen und fand letzteres auch deutlich einfacher und v.a. anschaulicher. V.a. die Sache mit Referenzen und Zeigern ist bei C++ schwierig. Aber C++ hat durchaus seine Vorteile.
> 
> Die Aufteilung von Header und Class finde ich aber durchaus sinnvoll. Das ist doch nichts anderes, als wenn du in Java ein Interface erstellst und dann Klassen, die dieses Interface implementieren, also in der einen Datei definierst du, was ein Objekt kann und in der anderen Datei sagst du, wie das geht.



Ja, aber in Java entscheide ich wann ich ein Interface nutzen will um mich zu einer Implementierung zu zwingen. Klar hat C++ Vorteile, schließlich ist sehr vieles was wir so nutzen in C++ geschrieben, aber ich finde es halt wirklich sehr anstrengend zu programmieren.


----------



## MasterK (31. Jan 2012)

HimBromBeere hat gesagt.:


> Die Aufteilung von Header und Class finde ich aber durchaus sinnvoll. Das ist doch nichts anderes, als wenn du in Java ein Interface erstellst und dann Klassen, die dieses Interface implementieren, also in der einen Datei definierst du, was ein Objekt kann und in der anderen Datei sagst du, wie das geht.


Nein, das ist was ganz anderes. Die Aufteilung in Header und Implementierung in C++ ist etwas vollkommen anderes als Interfaces. Interfaces (so wie Java sie versteht) sind in C++ nichts anderes als pure virtual classes.
Die Aufteilung in Header und Implementierung resultiert vielmehr aus dem Compile-Modell von C++, und das wiederum hat durchaus auch historische Gründe.


----------



## ChrisX (31. Jan 2012)

Die Aufteilen in Header und Source ist zudem noch zur Verringerung der Compilezeit sowie zum Schutz der Implementierung da, falls man nur die Objektdateien mit den Headerdateien ausliefert.


----------



## Marco13 (31. Jan 2012)

Ah, mal wieder ein Thread mit dem Potential, nach einigen Seiten gebashe über "Welche Sprache ist die beste" geschlossen zu werden 

Ich finde C++ auch kompliziert. So irritierend das im ersten Moment erscheinen mag, hat das doch einen erstaunlich einfachen Grund: C++ IST kompliziert  Und in weiten Teilen deutlich komplizierter, als es sein müßte. Und es ist so kompliziert, dass es praktisch keiner richtig kann. Ich habe noch nie jemanden getroffen, der von sich behauptet hätte, ein guter C++-Programmierer zu sein, und wenn, dann wäre es mir eine helle Freude, ihm zu beweisen, dass er Unrecht hat :hihi: (und wenn jemand meint, er würde C++ programmieren, und man in seinem Code dann alles von printf bis atoi und eine eigene String-Klasse findet, er aber noch nie von boost oder Pimpl gehört hat, erübrigt sich die Diskussion aus meiner Sicht)

Ganz subjektiv finde ich, dass C++ schon ""einige coole Features"" hat. Viele coole Bibliotheken gibt es erstmal nur für C/C++, und Brücken zu diesen Libs sind eben immer das: "Nur" (B/K?)rücken. Was man mit templates alles machen kann, läßt Generics wie einen schlechten Witz aussehen. Von Operatorenüberladung und Pointer-Magic mal ganz abgesehen. Aber genau das ist es auch, was C++ so unbeherrschbar macht. Schon um auch nur annhähernd die Bequemlichkeit und Sicherheit (!) zu haben, die bei Java eingebaut ist, braucht man mindestens Qt und die halbe boost, und überschaubar ist es dann schon lange nicht mehr, obwohl man eigentlich noch nichts gemacht hat. Allgemein braucht man _ungeheuer_ viel "Disziplin" beim Programmieren. 

Also: Programmieren mit C++ ist unproduktiv, und Java ist viel besser als C++ 

Mal im Ernst: Es kann nicht schaden, sich damit zu beschäftigen. Aber es gibt IMHO immer weniger Gründe, warum man ein Programm from Scratch in C++ schreiben sollte :bahnhof:


----------



## MasterK (31. Jan 2012)

Marco13 hat gesagt.:


> Ich habe noch nie jemanden getroffen, der von sich behauptet hätte, ein guter C++-Programmierer zu sein, und wenn, dann wäre es mir eine helle Freude, ihm zu beweisen, dass er Unrecht hat :hihi:


Ich behaupte das von mir. Aber ich behaupte bei weitem nicht, alle Feinheiten von C++ zu kennen.



Marco13 hat gesagt.:


> Aber es gibt IMHO immer weniger Gründe, warum man ein Programm from Scratch in C++ schreiben sollte :bahnhof:


Das stimmt durchaus. Bei den meisten Anwendungsprogrammen ist die Wahl der Sprache inzwischen wirklich fast schon nebensächlich. Ausserdem werden momentan sowieso fast nur noch Java Entwickler produziert. Der fast schon religiöse Glaube an den GC (das liesse sich wunderbar als Aufhänger zum Bashen benutzen) führt dann aber auch mal dazu, dass es plötzlich heisst, das Programm verbraucht zu viel Speicher. Und dann sitzen die Durchschnitts-Java-Coder da, haben sich in ihrem Leben noch nie Gedanken um Speicheroptimierung gemacht und fangen dann an zu jammern.


----------



## musiKk (31. Jan 2012)

Mir gehts ähnlich wie jDennis79. Ab und an schaue ich es mir an, aber nicht lange. Konträr zu dem, was sicher viele C++-Entwickler denken mögen, halte ich C++ auch für extrem komplex. Was mich am meisten stört, sind die Fehlermeldungen. Dass es einen Error Decryptor gibt, sagt ja schon einiges. Wenn ich bei einer ganz einfachen Zuweisung riesige Template-Fehlerberge bekomme, dann habe ich auch keine Lust, weiterzumachen. Ist ja nicht so, als würde ich es brauchen. Es gibt genug andere und vor allem modernere Sprachen.

Sollte jemand mal ein "C++ for Java Developers" auftun, würde ich dem Ganzen vielleicht nochmal einen Anlauf spendieren.


----------



## ChrisX (31. Jan 2012)

Das mit den Template Fehlermeldungen habe ich auch schon gehört, soweit bin ich aber nie gekommen. Da soll man überhaupt nicht mehr durchblicken was denn den Fehler verursacht haben könnte. Respekt an die Leute die da durchblicken, wirklich.

Ich möchte darauf hinweisen dass ich hier keinen Flamewar anzetteln will, sondern nur wissen wollte ob noch mehr Leute mal ernsthaft C++ ausprobiert haben, aber dann doch abgebrochen haben, weil es so extrem komplex ist.

Ich stelle auch hier den Sinn von C++ nicht in Frage, sondern freue mich wenn ich nicht der einzige Dumme bin der zu blöd oder faul ist das C++ Lernen durchzuhalten.


----------



## MasterK (31. Jan 2012)

Templates in C++ sind eben ein ungemein mächtiges Feature. Ohne Erfahrung geht es da nicht und ja, man tut sich da anfangs wirklich schwer in der Fehlermeldung den eigentlichen Fehler zu finden. Es hilft auf jeden Fall, einen halbwegs erfahrenen C++ Entwickler an der Seite zu haben.


----------



## Landei (31. Jan 2012)

Ich habe rudimentäre C++-Kenntnisse, aber würde mir "die volle Packung" nicht antun. Die Zeit investiere ich lieber in Haskell oder Scala (*), da lerne ich nicht neue Sprachen, sondern neue Ideen und Konzepte. Wir brauchen nicht immer ausgefeiltere Methoden, um eine Turing-Maschine zu bedienen, sondern wir brauchen neue Methoden, um unsere Gedanken und Visionen in Code umzusetzen. Ich hoffe, meine fremdsprachlichen Ausflüge machen mich auch zu einem etwas besseren Java-Entwickler. C++-Lernen würde mich wahrscheinlich zu einem schlechteren machen.

(*) Ich will mich bestimmt nicht auf diese Sprachen versteifen, Clojure, Erlang, F# u.s.w. haben sicher einen ähnlichen Effekt.


----------



## Marco13 (31. Jan 2012)

MasterK hat gesagt.:


> Ich behaupte das von mir. Aber ich behaupte bei weitem nicht, alle Feinheiten von C++ zu kennen.



Ja, die Formulierung war auch etwas (!) polemisch-provokativ. Natürlich ist es in C++ leichter, 10 Zeilen Code zu schreiben, bei denen praktisch niemand mit Sicherheit sagen kann, was ausgegeben wird (auch ohne obfuscation!), und im Zweifelsfall kommt es auch darauf an, wonach man "gut" beurteilt: Es gibt viele Kriterien für "gute" Software, die von der Sprache unabhängig sind. In C++ ist z.B. der Gedanke von Interface+Impl auch umsetzbar, mit komplett virtuellen Klassen und Pimpl und Boost - aber eben sehr viel aufwändiger (mindestens 4 sehr kryptische cpp/h-Dateien + Extra-Lib, gegenüber 2 einfachen Java-Files), und es gibt _unglaublich_ viele Quellen für Fehler, die _sehr_ schwer aufzuspüren sind. (Wenn mich bei Java mal wieder eine Flut von Exceptions aus schlecht strukturierten Programmen nervt, schreibe ich ein paar Zeilen C++, und nach einer Weile fange ich an, Exceptions wieder zu lieben  )

Die template-Fehlermeldungen sind da schon fast ein Klassiker. Aber wer schonmal zwei verschachtelte Generics verwendet hat, und dann dieses "<capture#34-of ? extends <capture#15-of ? Comparable<capture#3-of ?>> can not be cast to <capture#14-of ? extends <capture#145-of ? Comparable<capture#31-of ?>>" gesehen hat, weiß: Java nähert sich dem an 

@Landei: Ob man durch C++ "schlechter" werden würde oder könnte, sei mal dahingestellt - ich glaube, mal etwas (!) näher an dem zu sein, was im Rechner abläuft, kann nicht schaden. Gleichzeitig stimme ich dir aber vollstens zu, dass abstraktere Mittel dringend notwendig sind, um seine Gedanken (mit der entsprechenden Hebelwirkung größerer Ausdrucksstärke) umsetzen zu können. Das haben aber auch die C++-Leute erkannt. Wenn du dir selbst "rudimentäre" C++-Kenntnisse zuschreibst, könnte sich das auf Klassen und Pointer usw. beziehen. Aber sowas wie das schon mehrfach erwähnte Boost ist ein Werkzeugkasten, mit dem man schon was reißen kann. Und schon das, was die STL bietet, z.B. in den Headern <algorithm> und <functional> (als Beispiele: Transformation algo/transf2.cpp oder Funktionskomposition fo/compose11.hpp ) ist so gesehen näher an Scala, als alles, was es im Java Collections Framework so gibt


----------



## Landei (31. Jan 2012)

Frameworks und Bibliotheken für recht "gewöhnliche" Aufgaben sind oft ein Anzeichen für konzeptionelle Schwächen der Sprache. Nehmen wir Google Guice (kein schlechtes Wort darüber, ich liebe das Ding): In Scala oder Haskell ist es schlicht überflüssig, weil die Sprache selbst mächtig genug ist, Dependency Injection auszudrücken. Oder lambdaj, das auf wahnsinnig clevere Weise funktionale Konzepte in Java hineinmogelt. 

Ähnliches gilt sicher für große Teile von STL und Boost: Es sind Krücken, die einen über Unzulänglichkeiten von C++ hinweghelfen. Im Vergleich hat z.B. Haskell winzige Bibliotheken, nicht nur, weil man die gleiche Sache viel kürzer als in C++ ausdrücken kann (was nicht heißt, dass man nicht genauso lange daran herumüberlegt), sondern die Einzelteile auch viel wiederverwendbarer sind, und vieles nicht ausprogrammiert ist, weil es für den Nutzer so einfach ist, einen zusätzlichen Effekt selbst hinzuzufügen.


----------



## musiKk (1. Feb 2012)

MasterK hat gesagt.:


> Templates in C++ sind eben ein ungemein mächtiges Feature. Ohne Erfahrung geht es da nicht und ja, man tut sich da anfangs wirklich schwer in der Fehlermeldung den eigentlichen Fehler zu finden. Es hilft auf jeden Fall, einen halbwegs erfahrenen C++ Entwickler an der Seite zu haben.



In meinem Fall wollte ich glaube ich einen Eingabestrom einer anderen Variablen zuweisen und das hat ne riesige Explosion gegeben. Ich habe also selbst noch gar nichts direkt mit Templates gemacht.

Aber wie dem auch sei. Ich wollte binäre Dateien parsen und als ich feststellte, dass ich mich auch noch mit Endianness herumschlagen muss, hatte ich gleich die Nase voll. In der Hinsicht komme ich mir wirklich verwöhnt vor.



Landei hat gesagt.:


> Ich habe rudimentäre C++-Kenntnisse, aber würde mir "die volle Packung" nicht antun. Die Zeit investiere ich lieber in Haskell oder Scala (*), da lerne ich nicht neue Sprachen, sondern neue Ideen und Konzepte.



Sehe ich im Prinzip ähnlich. Eine Sprache ist ein Werkzeug, welches die Vielseitigkeit eines Entwicklers erhöht. Wenn ich allerdings sehe, dass viele (mich eingeschlossen) in C++ schon bei vergleichbar einfachen Aufgaben nicht viel reißen können, ist das schon schade, weil man offensichtlich doch nicht so einfach die "die Sprache ist für einen Entwickler egal"-Regel anwenden kann (die ich sowieso für eine Mär halte).


----------



## Marco13 (1. Feb 2012)

Landei hat gesagt.:


> Ähnliches gilt sicher für große Teile von STL und Boost: Es sind Krücken, die einen über Unzulänglichkeiten von C++ hinweghelfen.



Die Grenze zu ziehen zwischen "spracheigenen Features" und einer "Standard-API" kann schwierig werden, wenn's um Details geht: Einerseits hast du recht wenn es um Dinge wie 'variant' oder 'smart_ptr' geht (Quasi "Collection<Object>" und ... ja, eine ganz normale (Java-) Referenz eben :bahnhof: ). Bei den "Function Objects" wird dann noch deutlicher, dass das der aufwändige Nachbau von dem ist, was eine Funktionale Sprache einfach ausmacht. Aber spätestens bei sowas wie die Boost Graph Library wird klar, dass nicht alles davon in anderen Sprachen überflüssig wäre.


----------



## Evil-Devil (1. Feb 2012)

So schwierig ist C++ nicht. Zwar nicht so "einfach" wie Java, aber am Anfang benötigt man Templates und andere fortgeschrittene Techniken nicht. In Java fängt man auch nicht mit Threads und Generics an.

Einfache Konsolenanwendungen in C++ zu schreiben ist simpel. KLeinere GUIs mit einer externen Lib sind schon sehr viel umfangreicher, aber lernen imho sehr gut den Umgang mit der Sprache. Templates etc sollte man erst nutzen, wenn man wirklich fit in den Grundlagen ist und mit Pointern im Schlaf hantieren kann.

Letztere sind imho der eigentliche Alptraum, wenn gleich sie doch sehr mächtig sind 


Lass dich nicht entmutigen und fang klein an. Wie in jeder Sprache lernt man nie aus und es kommt immer etwas neues. Also nix überstürzen und lieber ein paar Monate länger für die Sprache benötigen. C++ lernt man übrigens nicht mal eben nebenbei. Das dauert einige Jahre um wirklich fit zu werden.


----------



## maki (1. Feb 2012)

MasterK hat gesagt.:


> Wieder mal C++, ja?
> 
> Meine Erfahrung: Java Entwickler tun sich beim Umstieg auf C++ deutlich schwerer als umgekehrt.
> 
> ...


Ich habe bei (erfahrenen?) C++ Entwicklern die auf Java umsteigen oft das Gefühl, dass nicht einige Prinzipien der OO nicht wirklich verfestigt sind bzw. manches einfach auch fehlt (Muster, SoC, Depdency Injection, etc.).

Typischerweise wird erstmal ein (meist überflüssiger und daher sinnfreier) Copy-Konstruktor implementiert, dafür sind Dinge wie DI oft komplett unbekannt, der Unterschied zwischen Referenzen und Zeigern ist in C++ nunmal da, in Java nennen wir das Referenzen aber gemeint sind Zeiger (im C++ Jargon), was dann zum nächsten Missverständnis im Bezug auf Call By Value führt.

Der Umstieg von C++ auf Java ist auch IMHO einfacher, aber nicht unbedingt einfach. Schwierig macht es einmal dass eben die Schlüsselwörter/Syntax recht ähnlich sind, aber wie du sagst der Teufel im Detail steckt. Java mag zwar mit der C/C++ Syntax recht ähnlich sein, aber zur Laufzeit hat Java mehr Ähnlichkeiten mit zB. Smalltalk als C++ (Reflection, Klassen zur Laufzeit, etc., damit meine ich nicht "nur" RTTI).

Als ich damals umgestiegen bin von C++ auf Java habe ich die Sprache als Erleichterung empfunden, musste mir weniger Gedanken um Details machen, manche Dinge sind von Haus aus klarer strukturiert (eben keine Trennung zwischen Header und Implementierung, javac kompiliert trotzdem schneller, was u.a. daran liegt dass er gar nicht soviel macht im Bezug auf Optimierungen etc. im Vegleich zu einem C++ Kompiler) weniger Alternativen um ein und dasselbe zu erreichen, mittlerweile ist Java auch voll von Altlasten (java.util.Date ist mutable, URL.equals ist schockierend, etc. pp.)

Das erlernen der API/Bibliotheken - also das, was einen Javaentwickler eigentlich dazu macht - dauert eben sein Zeit, das ist aber bei fast jeder Sprache so, die Sprachelemente sind recht schnell klar, aber die API und deren Nutzung braucht Erfahrung.


----------



## Gast2 (1. Feb 2012)

Moin,

ursprünglich stamme ich aus der C/C++ Welt ... bis ich mein Spiel mit Java angefngen habe, da ich nicht wusste ober der nächste Root-Server Linux oder Windows wird



Marco13 hat gesagt.:


> Es kann nicht schaden, sich damit zu beschäftigen.


:toll: - mir gehen gerade eine paar potenzielle Jobs durch die Finger (C++/HMI/Linux-Mischung) ... ich habe zwar (grundlegende) Ahnung von C++ ... aber da ich die letzten Jahre nur Java und .NET gemacht habe bin ich in C++ nicht mehr fit



> Aber es gibt IMHO immer weniger Gründe, warum man ein Programm from Scratch in C++ schreiben sollte :bahnhof:


 ... ich mache gerade andere Erfahrungen

um mein Spiel vorwärts zu bringen, benötige ich einen Client ... es gibt zwar einen - aber da muss man immer noch von Hand Befehle eintippen ... für Normal-Sterbliche-Spieler unbenutzbar - zumal der Client nicht direkt für meine Variante ist ... also habe ich versucht einen mit Swing zu beginnen ... um das Grundgerüst für die GUI hinzubekommen habe ich eine gefühlte Ewigkeit benötigt ... aus oben genannten Gründe setze ich mich seit Anfang der Woche wieder intensiv mit C++ auseinander ... interessant ist das die Unterschiede zu Swing (Layout-Manager etc.) bisher nicht so groß zum Qt-Framework sind

hand, mogel


----------



## ARadauer (1. Feb 2012)

HimBromBeere hat gesagt.:


> Also ich bin von C++ auf Java umgestiegen und fand letzteres auch deutlich einfacher und v.a. anschaulicher. V.a. die Sache mit Referenzen und Zeigern ist bei C++ schwierig. Aber C++ hat durchaus seine Vorteile.



Das finde ich auch. Ich denke wirklich C++ lernt man nur durch das anwenden. Jetzt einfach C++ lernen um einen neue Sprache zu können halte ich nicht für sinnvoll. 
Ausser man hat wirklich ein größeres Projekt vor sich bei dem man es braucht.
Ich würd da auf etwas anderes setzen... PHP braucht man für kleine Webprojekte schnell mal.
Oder C# ...schadet nicht wenn man schaut was die Konkurenz so treibt...


----------



## Ök (1. Feb 2012)

Nö, ich finde C++ nicht sonderlich schwer. Das schöne an C++ ist ja, dass es eben nur sehr wenige Grundlagen gibt*, aber die Sprache danach recht konsequent aufgebaut ist, man kann sich das Verhalten also gut erschließen.

Klar, insbesondere mit Templatemetaprogrammierung kann das Ganze schon kryptisch werden, aber das ist nun mal etwas, das es in Java nicht mal gibt. Zudem bekommt man bestimmt von niemanden den Kopf abgerissen, wenn man die Sprache in dieser Hinsicht nicht völlig ausnutzt. Solange man also auf "normalem" Niveau programmiert, hat man eine hübsche Sprache mit einigen Features, die Java leider fehlen.

 * Stack, Heap, Pointer und Referenzen sind nun wirklich nicht schwer, würde ich als totale Anfängerthemen bezeichnen; als ob es Leute gibt die das nicht verstehen.

PS:
Die Header/Cpp Trennung würde ich eher als Altlasten ansehen, mittlerweile leider veraltet und ein Graus. Das Modulsystem ist eines der wenigen Dinge, die ich an Java schätze.


----------



## Reisender (1. Feb 2012)

Um mal eben ein paar Klassen zu programmieren ist C++ nicht sonderlich schwer, da hast du recht. Um aber in C++ wirklich performant zu entwickeln bedarf es jahrelanger Erfahrung, denn nur weil was in C++ entwickelt wird bedeutet dies nicht automatisch dass es auch nur 1% schneller als in Java wäre.

Ich habe mir mal die Entwicklung einer Vektorklasse in C++ angeschaut, richtig schnell wurde es dann erst mit diversen Tricks per Templates, das Wissen welches man da haben musste war enorm.


----------



## Gast2 (1. Feb 2012)

> PHP braucht man für kleine Webprojekte schnell mal.


schreckliche Sprache ... damit werde ich überhaupt nicht warm ... mir fehlt da ernsthaft die Typensicherheit ... btw. falls mal jemand braucht für den Einstieg in PHP - Objektorientierte Programmierung mit PHP5 ... fand das sehr übersichtlich zum Einstieg



> Oder C# ...schadet nicht wenn man schaut was die Konkurenz so treibt...


die kochen auch nur mit Wasser


----------



## jDennis79 (1. Feb 2012)

mogel hat gesagt.:


> die kochen auch nur mit Wasser



Nur hat _deren_ Wasser wahrscheinlich 3 Sauerstoffatome pro Molekül, fließt nur in Würfelformation löscht Durst nur Montags, Mittwochs und Samstags, während es an den übrigen Tagen durstiger macht.


----------



## Ök (2. Feb 2012)

Reisender hat gesagt.:


> Ich habe mir mal die Entwicklung einer Vektorklasse in C++ angeschaut, richtig schnell wurde es dann erst mit diversen Tricks per Templates, das Wissen welches man da haben musste war enorm.


Sorry, aber jedes

```
template<typename T, std::size_t N>
class geo_vector
{
  T a_[N]
};
```
wird wohl wesentlich schneller sein als Java Zeugs. Und das ist nun wirklich nicht so sehr fortgeschritten. Klar, wenn man jetzt den operator * noch so aufbaut, dass er ein extra Multiplikationsobjekt zurückliefert um rekursiv zur Compilezeit eine Mehrfachmultiplikation zu optimieren ist das noch mal eine andere Geschichte - aber wie ich bereits erwähnte, braucht man das nicht um an vielen Stellen eine wesentlich bessere Performance als Java zu erreichen. (Und dank Operatorüberladungen, Destruktoren und auto sogar schöneren Code zu haben.  ) Da reichen auch solche Grundlagen wie oben gezeigt.


----------



## Marco13 (2. Feb 2012)

Jetzt noch iteratoren und allocator-traits und Zuweisungsoperator, und in der Doku spezifizieren, welche Concepts implementiert werden und von den enthaltenen Elementen implementiert werden müssen, und wenn man dann noch boost smart_ptr-Objekte dort reinlegt und die Impelementierung mit Pimpl versteckt, hat man fast schon sowas ähnliches wie eine List<T>. Und sogar effizienter!


----------



## Evil-Devil (2. Feb 2012)

mogel hat gesagt.:


> schreckliche Sprache ... damit werde ich überhaupt nicht warm ... mir fehlt da ernsthaft die Typensicherheit ... btw. falls mal jemand braucht für den Einstieg in PHP - Objektorientierte Programmierung mit PHP5 ... fand das sehr übersichtlich zum Einstieg


Hauptproblem bei PHP5 ist das man sich an keinen Standard halten muss solange man kein Framwork nutzt.

Mal kurz ein paar Zeilen hingerotzt die das gewünschte erledigen sind schnell erledigt. Sauberen PHP Code zu schreiben der auch nach Monaten oder gar Jahren gut wartbar ist, ist sehr schwierig. Ganz gleich ob mit oder ohne Framework.

Bei uns im Betrieb war mal einer der sich nie groß weiter entwickeln wollte. In einem Ruby PRojekt standen dann plötzlich Logiken, die an sich über mehrere Funktionen verteilt gut wartbar gewesen wären, innerhalb nur einer FUnktion.

Eine Funktion von 500-1000 Zeilen ist toll 
Und sowas sieht man leider auch sehr oft in PHP, da es sehr leicht dazu verleitet nicht sauber zu programmieren.


----------



## Ök (2. Feb 2012)

Marco13 hat gesagt.:


> Jetzt noch iteratoren und allocator-traits


 Für einen mathe Vektor? oO


Marco13 hat gesagt.:


> und Zuweisungsoperator,


Für POD Typen? oO


Marco13 hat gesagt.:


> und in der Doku spezifizieren, welche Concepts implementiert werden und von den enthaltenen Elementen implementiert werden müssen,


Ja.. oder aber, wenn man unbedingt will, nen static_cast einbauen.



Marco13 hat gesagt.:


> und wenn man dann noch boost smart_ptr-Objekte dort reinlegt und die Impelementierung mit Pimpl versteckt,


boost smart_ptr Objekte statt unique_ptr? oO Pimpl bei so etwas simplem? oO



Marco13 hat gesagt.:


> hat man fast schon sowas ähnliches wie eine List<T>.


 Eine Liste funktioniert nun wirklich völlig anders, das sollten sogar die Java Leute wissen. oO

Und weils noch nicht genug war: oO


----------



## ChrisX (2. Feb 2012)

Nach dem ich mir hier alles durchgelesen habe werde ich es doch noch mal mit C++ versuchen. Ich habe jetzt viel drüber gelesen und viele empfehlen C++/Qt mit dem Qt-Creator und haben damit ein schönes gut dokumentiertes Framework.

Kennt sich jemand mit C++ in Verbindung mit Qt aus und kann dies bestätigen?


----------



## hartzie (2. Feb 2012)

Ja der QtCreator ist eine ziemlich gute IDE und das Qt Framework hat alles was man sich wünschen kann


----------



## ChrisX (2. Feb 2012)

Super, na dann werde ich mich mal ins Abenteuer stürzen. Java bleibt natürlich weiterhin auf der ToDo-Liste


----------



## Ök (2. Feb 2012)

ChrisX hat gesagt.:


> Super, na dann werde ich mich mal ins Abenteuer stürzen. Java bleibt natürlich weiterhin auf der ToDo-Liste


Wenn dir die Lernkurve bei C++ zu flach ist (was gerade am Anfang durchaus der Fall sein kann), dann könntest du auch gleich mal einen Blick auf C werfen.
Die Konzepte von Pointern, Stack, Heap und Scope (einige Dinge, die es in Java so direkt nicht gibt, bzw. die nicht unterschieden werden), werden dir auch da klar, und du musst dich nicht gleich mit Templates und OOP rumschlagen. Wenn du dann wieder zu C++ wechselst hast du schon gleich einige Fragen weniger, und kannst dich besser auf die ++ Sachen konzentrieren.


----------



## Marco13 (2. Feb 2012)

Ök hat gesagt.:


> Für einen mathe Vektor? oO



Um diese und alle weiteren "oO"'s abzuhandeln: Ich bin davon ausgegangen, dass es um einen std::vector ging. Dass dessen Impelementierung nicht unbedingt "verständlich sein muss...

```
iterator insert(iterator __position, const _Tp& __x) {
    __stl_debug_check(__check_if_owner(&_M_iter_list, __position));
    size_type __n = __position - begin();

    if (_M_finish != _M_end_of_storage._M_data) {
      if (__position == end()) {
	__STLPORT_STD::construct(_M_finish, __x);
	++_M_finish;
      } else {
	__STLPORT_STD::construct(_M_finish, *(_M_finish - 1));
	++_M_finish;
	_Tp __x_copy = __x;
	copy_backward(_Make_ptr(__position), _M_finish - 2, _M_finish - 1);
	*__position = __x_copy;
      }
    }
    else
      _M_insert_overflow(_Make_ptr(__position), __x);
    return begin() + __n;
  }
```
... ist klar, aber wenn man "sowas" (wie eine List<T>) nachbauen wollte, würden sich eben all diese Fragen stellen....


----------



## Ök (2. Feb 2012)

Marco13 hat gesagt.:


> Dass dessen Impelementierung nicht unbedingt "verständlich sein muss...


 Nun ja, verständlich sein müssen tut die Implementierung nicht, ne. Was du hier gepostest hast ist aber auch ein STL Implementierung die wohl in ein viel größeres Konstrukt eingebunden ist.

Und ja, einen std::vector mit allen Anforderungen des Standards nachzubauen kann schon mal ~1.5 Stunden dauern, aber was willst du mir jetzt damit sagen? Dass dir die C++ Standardbibliothek zu umfangreich ist? 



Marco13 hat gesagt.:


> ... ist klar, aber wenn man "sowas" (wie eine List<T>) nachbauen wollte, würden sich eben all diese Fragen stellen....


 Ein std::vector ist immer noch etwas völlig anderes als eine Liste..


----------



## Ök (2. Feb 2012)

Ök hat gesagt.:


> Ein std::vector ist immer noch etwas völlig anderes als eine Liste..


Edit: Na gut, in Java scheint eine Liste nur ein abstraktes Interface zu sein, insofern ist der Vergleich so nicht möglich. Wobei man sich fragt, warum die das so genannt haben, wollten wohl weg von die pösen Arrays. (Liste mit Indexzugriff.. prrr.. da läuft es einem ja kalt den Rücken runter.  )


----------



## nok (2. Feb 2012)

Ök hat gesagt.:


> Edit: Na gut, in Java scheint eine Liste nur ein abstraktes Interface zu sein, insofern ist der Vergleich so nicht möglich. Wobei man sich fragt, warum die das so genannt haben, wollten wohl weg von die pösen Arrays. (Liste mit Indexzugriff.. prrr.. da läuft es einem ja kalt den Rücken runter.  )



Besonders viel Ahnung vom Java, dem Collection-Framework (und OOP im allgemeinen) scheinst du ja echt nicht zu haben. Ein typischer C++ Fanboi halt...


----------



## Ök (2. Feb 2012)

nok hat gesagt.:


> Besonders viel Ahnung vom Java, dem Collection-Framework (und OOP im allgemeinen) scheinst du ja echt nicht zu haben. Ein typischer C++ Fanboi halt...


Und alle deine Argumente scheinen aus "du hast keine Ahnung", "du bist Doof", "Java ist toll", "Performance ist nicht alles" und "Java wird C++ bald ersetzen, weil Performance immer unwichtiger wird!!!1!1!" zu bestehen. Ein typischer Java Fanboy halt.


----------



## ChrisX (2. Feb 2012)

Ich denke alle möglichen Standard Algorithmen und Datenstrukturen macht man eh über Libs wie Lemon oder Eigen, zusammen mit Qt, da hat man schon eine Menge Komfort + Performance. 

Ist halt nur kniffelig wenn man wirklich alles von C++ verstehen will. C und Assembler habe ich früher oft gemacht, daher ist das Verständnis für Pointer nicht wirklich das Problem. Ich würde halt nur selbst gerne hochperformante Sachen schreiben, aber an die beiden Libs z.B werde ich als Einzelperson eh nie herankommen, die sind wohl extremst schnell.


----------



## Illuvatar (2. Feb 2012)

Anonyme User, die sich darum battlen welche Sprache den längsten hat, brauchen wir hier nun wirklich nicht.
Da das Thema als erledigt markiert ist schätze ich, es stört keinen, wenn ich das Thema hier beende.
Falls es doch jemanden stört und er hier noch etwas konstruktives beitragen möchte, darf er mir gerne eine PN schreiben.


----------

