Unterschiede zu C++ für Umsteiger von Java



  • Artchi schrieb:

    Naja, Java ist auch nur in der Basis nutzerfreundlich....

    Genau das meinte ich mit "für Anfänger" und "in enterprise environments relativiert sich das sehr schnell". 😃

    Gruß,

    Simon2.



  • der Umsteiger schrieb:

    Super, genau so hatte ich mir das vorgestellt. 👍

    Vllt hat ja noch jemand Tipps wie tntnet, was ich mir so abgewöhnen bzw angewöhnen sollte.

    Schon mal danke an alle, habt mir auf jeden Fall gute Tipps zur Orientierung gegeben 🙂

    - vermeide C-Style Coding, stattdessen:
    - benutze std::string und std::wstring
    - benutze std::vector und std::list
    - seit April gibts auch std::tr1:array
    - benutze ausgiebigg die Standard-Bibliothek, sie ist sehr flexibel und mächtig!
    - vermeide Makros, da sie fehleranfällig sind, C++ hat gute Ersatzkonstrukte
    - später würde ich noch Boost (eine Library Sammlung) benutzen



  • ok, mir haben die tipps auch was gebracht,
    wenn man aber von java kommt, sollte man oop programieren gewohnt sein(und das ist in c++ ja auch in ordnung).
    Da frag ich mich grad wie man das ohne zeiger machen soll?
    nur mit referenzen und stack objekten?
    Dazu braucht man doch schon nen zeiger, sonst kann man doch keine virtuellen funktionen aufrufen, oder?
    bin noch nicht wirklich erfahren, aber das hat mich jetzt schon verunsichert und verwirrt.
    Kommt ja auch wie schon gesagt auf die aufgabenstellung an.
    Wenn ich da auf dem holzweg bin muß ich das nun erfahren,
    gruß



  • Ja, das habe ich auch sehr lange geglaubt, das ausschliesslich über Pointer virtuelle bzw. polymorphe Aufrufe funktionieren. Ich bin auch der Meinung, das ich das aus dem Stroustrup-Buch habe. 🙄 Müsste ich mich aber nochmal vergewissern, das es in dem Buch drin stand.

    Aber das kannst du ja leicht selbst mal ausprobieren, um dich zu überzeugen. Hier mal mein Beispiel:

    #include <iostream>
    
    class base
    {
      public:
    	virtual void foo()
    	{ 
    		std::cout << "base::foo()" << std::endl;
    	}
    };
    
    class special : public base
    {
      public:
        virtual void foo()
    	{
    		std::cout << "special::foo()" << std::endl;
    	}
    };
    
    void bar(base &b)
    {
       b.foo(); // polymorpher Aufruf (late binding)
    }
    
    int main()
    {
        base b;
    	bar(b);
    
    	special s;
    	bar(s);
    }
    

    Ausgabe:

    base::foo()
    special::foo()
    

    Kein einziger Pointer und kein einziges new benutzt.



  • das war sehr überzeugend. danke, muß wohl ernsthaft umdenken.
    gruß



  • net schrieb:

    ist halt wie mit allem in C++ - man braucht externe libs.
    in java ist das threading aber schon eingebaut. C++ hat auch nix, was dem java keyword 'synchronized' entsprechen würde.

    In Java muß alles eingebaut sein, da man sonst nicht machen kann. In C++ steht die Betriebssystem-API zur Verfügung. Da braucht man nicht unbedingt externe libs. Und ein synchronized ist nicht so schwer über eine Mutex- und eine Guard-Klasse nachzubauen.

    tntnet schrieb:

    "instanceof" ist in der Regel schlechter Programmierstil.

    welch kühne behauptung...

    Bei einem sauberen Design ist das selten notwendig. Bis Java 1.4 war es unbedingt notwendig, um einigermassen sicher mit Containern umzugehen. In einem sauberen Design verwendet man virtuelle Methoden. Es gibt sicher Situationen, wo das doch notwendig und sinnvoll ist. Aber dafür gibt es in C++ eben ein äquivalent.

    noch was:
    * c++ hat keine 'reflection api' (ich weiss, das ist nur was für leute mit schlechtem programmierstil) 😉
    * c++ unterstützt von haus aus keine webtechnologien (wie java mit servlets, applets, jsp, xml, soap...)

    Die 'reflection api' kann durchaus als Argument für Java gelten. Aber wenn Du das in die Abteilung "schlechtem programmierstil" steckst, dann will ich Dir nicht wiedersprechen 😉 .

    Java unterstützt auch von Haus aus keine Webtechnologie. Das kommt erst mit der erweiterten API J2EE (und in C++ erst mit http://www.tntnet.org/ 😉 ). Ist ein schwaches Argument. Du hast natürlich Recht, daß in Java vieles standardisiert ist. Das ist der grosse Vorteil von Java.

    Tntnet



  • Artchi schrieb:

    ...Hier mal mein Beispiel:...
    Kein einziger Pointer und kein einziges new benutzt.

    Sehr schönes Beispiel !!! 👍
    Und eigentlich nicht anders als der Javacode, der dasselbe macht (nur 2 news weniger und ein & mehr).

    Das ist IMO ein (in der Javagemeinde gut gepflegtes) Gerücht, dass man beim Umstieg auf C++ nur noch "mit Sternchen" programmiert und überhaupt nicht mehr durchsteigt.

    @QarateKid: Wenn Du noch was wirklich Nettes in C++ machen willst: Schau Dir mal die STL-Container und -algorithmen an ! Die machen wirklich Spaß - und das kennst Du von Java noch nicht. 😃

    Gruß,

    Simon2.



  • tntnet schrieb:

    ...Du hast natürlich Recht, daß in Java vieles standardisiert ist. Das ist der grosse Vorteil von Java....

    Da bin ich skeptisch ... ein "weiter Standardbegriff" ist oft auch ein "weicher Standardbegriff".
    Auf jeden Fall sehe ich da kein starkes Argument für Java drin (und schon gar kein "großer Vorteil").

    Gruß,

    Simon2.



  • Simon2 schrieb:

    tntnet schrieb:

    ...Du hast natürlich Recht, daß in Java vieles standardisiert ist. Das ist der grosse Vorteil von Java....

    Da bin ich skeptisch ... ein "weiter Standardbegriff" ist oft auch ein "weicher Standardbegriff".
    Auf jeden Fall sehe ich da kein starkes Argument für Java drin (und schon gar kein "großer Vorteil").

    Gruß,

    Simon2.

    Ich denke schon, daß das ein Problem ist. Viele sagen halt: "In C++ muß ich alles selber machen oder eine externe Bibliothek bemühen". Und das ist gar nicht so falsch. Wenn ich eine JRE installiert habe, sind viele Standardaufgaben bereits installiert. Mit C++ handele ich mir schon unter Umständen viele Abhängigkeiten von externen Bibliotheken ein, was die Sache schwierig macht.

    Java als Sprache finde ich bescheiden. Da ist C++ weitaus besser. Die Infrastruktur ist es, was die Java-Plattform ausmacht. Zumindest wenn man sich auf die Java-Insel beschränkt.

    Oh Gott - jetzt verteidige ich schon Java. Ich sollte vielleicht noch ergänzen, daß ich C++ für die beste Programmiersprache der Welt halte und nie mit Java tauschen wollte. Nur um keine Missverständnisse aufkommen zu lassen 😃

    Tntnet



  • Also dieses Argument mit den Abhängigkeiten zu externen Libs habe ich bisher nie verstanden. Kann mir bitte jemand sagen, was daran schlecht sein soll? Bitte nicht sowas wie "Ich muß die Lib in die IDE-/Projekt-Settings eintragen, das kostet mich immerhin 10 Sekunden meines wertvollen Lebens".

    Ich habe hier schon diverse Java-Projekte für unseren Kunden gemacht. Ich habe noch NIE am Projektanfang nur mit der Java-Basis angefangen. Das erste was ich bei jedem Projekt mache, ist mir erstmal meine Lieblings-Javalibs und ungewollt nötigen Libs zusammen zu suchen und diese in meinem Projektsettings in Eclipse einzurichten, damit ich vernünftig arbeiten kann. Keiner von den über 50 Java Projekten am Standort kommt mit der Basis aus. Wir benutzen sogar DLLs für unsere Java-Programme, weil wir z.B. PKI-Karten über Java ansteuern müssen.

    Wir ersetzen sogar Basis-Libs durch fremde Libs, weil die uns gesonnener sind. Z.B. bietet die Java Runtime Logging-Klassen an. Wir knallen immer noch zus. Apaches Commons Logging mit log4j dazu. Schon mal eine zus. Abhängigkeit, die eigentlich nicht nötig wäre. Keiner hier in den Projekten fragt "Warum macht ihr eine Abhängigkeit zu einer externen Lib?" Niemand im Java-Umfeld kommt auf diese Idee. Aber in C++ ist es komischerweise schlecht, wenn ich z.B. sage "Ich brauche für Netzwerk die asio-Library."

    Also, was ist schlimm daran, wenn ich eine Lib für mein C++ brauche?



  • ich glaube in Java gibt es viel weniger Probleme Libraries einzubauen. In C++ muss man die Libraries doch oft noch durchkompilieren. Bei Java reicht ein einfaches import.



  • moep manche verwechseln bei ihren vergleichen die eingentliche sprache(Syntax, Schlüsselworter) mit einem eventuell vorhandenen Framework.

    Java an sich (ich meine nicht das Framework JSDK/JRE) kennt kein Threading oder Reflection.
    Nur durch das vorhandene Framwork, was bei java ein muss ist, damit ein java-programm überhaupt auf einem System laufen kann, bietet diese zusätzlichen features.

    ein besserer Vergleich wäre, wenn man bei c++ zumindestens die stl+boost dazunimmt und bei java das JDK/JRE-framework.

    Und schon sieht hier der Vergleich schon etwas anders aus.
    z.b. Threading werden von beiden unterstüzt.



  • tntnet schrieb:

    ...Wenn ich eine JRE installiert habe, sind viele Standardaufgaben bereits installiert...

    Gilt genauso, wenn ich mir ein Visual Studio C++ installiere....
    Es stimmt: Viele führen dieses Argument im Munde ... aber nur wenige von denen wissen, wovon sie da reden. 😉
    Wenn das ein Problem ist, dann ein Imageproblem - das vermutlich seinen Ursprung in der Entstehungsgeschichte von Java hat. Diese Argumente (auch "Java ist sicher/portabel/keine Zeiger/...") waren samt und sonders dazu da, die Existenz von Java (mit einer sehr C++-ähnlichen Syntax/Semantik) in einer Welt, in der es bereits C++ gab, zu legitimieren. Heute werden sie immer noch wiedergekaut, obwohl schon lange klar ist, dass sie nicht stichhaltig oder sehr viel irrelevanter sind.

    "Java ist ein Produkt mit einer C++-ähnlichen Konfigurationssprache" 😉
    (mit allen Stärken, die ein Produkt (gegenüber einer "Sprache") hat ... und allen Nachteilen)

    Gruß,

    Simon2.



  • libeinbinder schrieb:

    ich glaube in Java gibt es viel weniger Probleme Libraries einzubauen. In C++ muss man die Libraries doch oft noch durchkompilieren. Bei Java reicht ein einfaches import.

    Hä ?
    Wieso das ?
    Also ich habe immer fertig kompilierte Libs verwendet.
    (BTW: ein Recompile einer c++-lib ist immer noch schneller&einfacher als die Installation eines passenden JREs)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    "Java ist ein Produkt mit einer C++-ähnlichen Konfigurationssprache" 😉
    (mit allen Stärken, die ein Produkt (gegenüber einer "Sprache") hat ... und allen Nachteilen)

    So würde ich das nicht ausdrücken. Java und C++ sind beides (im Kern) Programmiersprachen und haben historisch bedingt eine ähnliche Syntax. Aber damit hören die Gemeinsamkeiten auch schon fast auf.



  • Ich denke, wir sollten hier nicht wieder in einen Java vs. C++ Thread ausarten. Ich wünsche mir für diesen Thread, das wir doch eher beim Thema C++ bleiben. Was auch das ursprüngliche Topic war. Java kennt der Topicersteller zu genüge. Mich würde eher C++ interessieren. Meine letzte Frage, bzgl. externe Libs ist immer noch unbeachtet.

    @libeinbinder! Ja, hier gebe ich dir zum Teil recht. Andererseits kann man daraus auch kein Problem machen, höchstens eine Schwierigkeit. Und ich gebe in den meisten Fällen die Schuld nicht C++ sondern den Library-Entwicklern. Wenn ich z.B. gtkmm schlecht unter MSVC builden und nutzen kann, liegt die Schuld beim gtkmm-Team. Denn die Boost Libs kann ich komischerweise auf mehr als 20 Compilern builden, mit EINEM einzigen Kommandozeilenbefehl!!! Warum ist das so? Weil Boost ein gutes C++ Buildsystem unterstützt. gtkmm unterstützt so ein, für meine Verständnisse, nicht so flexibles Buildsystem.

    D.h. die Umstände des Library-Builds lassen sich auf ein Minimum reduzieren. Soweit, das ich nur eine Kommandozeile eingeben muß um den Buildprozess zu starten.

    Weiterhin besteht bei kommerziellen Anbietern auch die Möglichkeit, das diese schon fertige Lib-Dateien anbieten. Im MS-Umfeld ist das praktisch gang und gebe.



  • ich hab noch'n paar nachteile von C++: :xmas2:

    * einfache datentypen sind in C++ variabel (länge, byte order usw.).
    * in C++ handelt man sich schnell 'undefiniertes verhalten' ein. das gibt's in java gar nicht (jedenfalls nicht das ich wüsste).
    * in C++ gibts keinen '>>>' operator. (okay, lässt sich leicht nachbilden, aber manchmal fehlt der eben).



  • Simon2 schrieb:

    tntnet schrieb:

    ...Wenn ich eine JRE installiert habe, sind viele Standardaufgaben bereits installiert...

    Gilt genauso, wenn ich mir ein Visual Studio C++ installiere....

    Ja, eben! Deshalb gibt es ja für Windows so viel Software. Ich kaufe VC++ und habe nach der Installation eine KOMPLETTE Entwicklungsumgebung um ALLES machen zu können, was mit Windows nur denkbar ist. Egal ob Serverprogrammierung, COM/ActiveX, Spiele (DirectX) usw. Im Prinzip müssten nur die anderen (Linux usw.) die APIs von Windows nachbauen. Schon hätte man eine C++-Runtime im Komplettpaket die für mehr als ein System verfügbar ist. 😉

    Im ernst, am Ende ist es doch egal, ob ich Eclipse und eine JRE einzeln installiere, oder ob ich VC++ und Boost einzeln installiere. Das was hier diskuttiert wird, ist Haarspalterei.

    Und wenn ich bedenke, das Boost mittlerweile bei diversen Linux-Distributionen vorinstalliert ist (ja, kaum zu glauben!) ist dies sogar fortschrittlicher als Java. Denn Java durfte bis vor kurzen zu keinem Betriebssystem ausgeliefert werden. Die Boost-Binaries sind komischerweise schon auf diversen Linuxen vertreten.



  • Es ist schon praktisch, wenn man den Kunden nicht dazu zwingen muss, 100MB an libs zu installieren, obwohl es möglich ist, mit nur 1MB und ohne Installation auszukommen.



  • CStoll schrieb:

    Simon2 schrieb:

    "Java ist ein Produkt mit einer C++-ähnlichen Konfigurationssprache" 😉
    (mit allen Stärken, die ein Produkt (gegenüber einer "Sprache") hat ... und allen Nachteilen)

    So würde ich das nicht ausdrücken. ...

    Naja, war auch "provokant überspitzt", um auszudrücken: Vieles, was als "Vorteil von Java" dargestellt wird, hat nichts mit der Sprache zu tun, sondern damit, dass sie an ein konkretes Produkt (und dessen Software) geknüpft ist ...

    Ist aber auch egal: Es geht dem Threadstarter ja gar nicht um die Frage "welche Sprache ist besser ?".

    Gruß,

    Simon2.


Anmelden zum Antworten