Warum hat C++ so eine aufwendige Syntax?



  • Artchi schrieb:

    Das ist so ein Typ, der nach jeder Blamage hier wieder mit einem neuen Nickname im Forum auftaucht. Und immer wieder die gleichen Threads startet und versucht es immer wieder.

    der startet überhaupt nix, der schreibt nur viel dazu. manchmal vielleicht etwas zu polemisch, aber da müsst ihr durch 😉



  • DEvent schrieb:

    Artchi schrieb:

    Diese ganzen Fakten, wie verschiedene Lib-Typen usw., sind nichts neues und gibts seit 20 Jahren. Also ich frage jetzt einfach mal: warum erzählt ihr uns das?

    Weil ich hoffe das man diese Nachteile der Sprache endlich verbessert.

    Deine Hoffnung ist vergeblich. Warum? Weil niemand vom C++ Komitee hier diese unsinnigen Java vs. C++ Threads liest.
    Wenn du es besser/anders haben willst, mußt du ein Proposal schreiben und es dem C++ Komitee vorlegen. Die warten auf Proposals, die haben sich sogar mal "beschwert" das die Community denen zu wenig Material und Feedback gibt.

    Hier im Forum bringt das rum geheule absolut nichts.

    DEvent schrieb:

    Nein, der kleinste gemeinsame Nenner ist die C++ Standardbiliothek (und die sollte jeder Compiler haben).

    Ich kann also eine Lib schreiben mit Compiler x unter System y, die Klassen exportiert, und diese Klassen dann in System g unter Compiler h wieder importieren?

    Nein, weil du jetzt von Maschinencode ausgehst, und der geht prinzipiell (unabhängig von C++) nicht auf einer fremden Plattform. Selbst wenn ich mit Java Maschinencode erzeuge, wird dein Wunsch nicht in Erfüllung gehen.

    Was du haben willst, geht nur mit Plattformen wie Java oder .NET. Wenn du DAS brauchst, dann steige auf die Sprachen der jeweiligen Plattformen um, die können das.

    DEvent schrieb:

    Gegenfrage: Wieso sollte man das verbieten?

    Weil Header eigentlich nur das Interface bekannt geben sollen.

    Wenn ich schon dabei bin: Wieso muss man in den Headers auch private-Member bekanntgeben?

    Weil es den Klassenaufbau beschreibt. Das ist das Konzept, weil es eine Altlast ist und das damals nunmal ein Verkaufsargument pro C++ war, weil man C-Projekte für C++ begeistern wollte. Auch wenn das heute nicht mehr so sein mag. That's racing!



  • Hat sich erledigt. Hab mir eine Playstation 3 gekauft.



  • Mr. N schrieb:

    Außerdem: du hast schon gemerkt, dass das Java-Beispiel wesentlich komplexer ist? Nochmal zum vergleichen:

    #include <iostream>
    int main() {
      std::cout << "Hello World! << std::endl;
    }
    

    versus

    package dem.mrn.sein.helloworld;
    
    class MyHelloWorld {
      public static void main(String [] arguments) {
        System.out.println("Hello World!");
      }
    }
    

    ja, den C++ code kannst du sogar noch runterkürzen, indem du die 'cout' zeile gegen ein simples 'puts' ersetzt. 😉



  • Jester schrieb:

    Mr. N schrieb:

    std::string a = "x", b = "x";
    a==b; //true
    

    🙂

    Na, der war mal wieder mit Anlauf. 😃

    String a = "x";
        String b = "x";
        if(a==b) System.out.println("a==b");
        else System.out.println("a!=b");
    

    magst Du das mal ausprobieren?

    Das untermauert übrigens auch weiter Deine Aussage, dass Du auch diese J-Geschichte bestens beurteilen kannst. 😃

    So, gerade habe ich Gregor gefragt, wie das denn ist. Du hast mein Beispiel falsch nach Java übersetzt. Du schriebst:

    String a = "x";
        String b = "x";
    

    Es sollte aber sein:

    String a = new String("x");
        String b = new String("x");
    

    Und dann gilt a==b nicht mehr.

    Ich nenne ein perfekt zutreffendes Beispiel, erwähne Java nichtmal, will also nur sagen, dass ich Value-Semantik toll finde und du kommst mit dem hier. Aber Gregor sagt ich soll mich nicht aufregen, hat er vermutlich auch Recht damit.



  • Artchi schrieb:

    ...

    DEvent schrieb:

    Gegenfrage: Wieso sollte man das verbieten?

    Weil Header eigentlich nur das Interface bekannt geben sollen.

    Wenn ich schon dabei bin: Wieso muss man in den Headers auch private-Member bekanntgeben?

    Weil es den Klassenaufbau beschreibt. Das ist das Konzept, weil es eine Altlast ist ...

    Ersterem würde ich zustimmen, Zweiterem nicht.
    Wer seine private-Sachen verstecken will, kann problemlos Idiome wie "pimpl" verwenden.
    Ich würde gerade einem Javaisten antworten: Warum muss ich in Java meine Implementierung in einem Header bekanntgeben ? (also nicht nur die Deklaration, sondern sogar deren Definition).

    Insgesamt muss man IMO hier unterscheiden zwischen

    • #include: Präprozessortechnik zur "Texteladen aus Datei"
    • "Header": Konzept der Trennung von Interface und Implementierung.

    Gruß,

    Simon2.



  • Mr. N schrieb:

    new String("x");

    soviel zu deinem sachverständnis von java 👍



  • Kann man auch Spiele für die Playstation 3 in Java schreiben?



  • Mr. N schrieb:

    Es sollte aber sein:

    String a = new String("x");
        String b = new String("x");
    

    Also mit Verlaub, dann klappt zwar das Beispiel, aber die korrekte Übersetzung von std::string a = "x"; nach Java ist String a = "x"; und nix anderes. Du kannst Dich natürlich jetzt noch ein bißchen winden, kannst aber auch einfach zugeben, dass Du es nicht wußtest und Dein Beispiel daher einfach nicht das gezeigt hat was Du zeigen wolltest. 🙂





  • Simon2 schrieb:

    Ich würde gerade einem Javaisten antworten: Warum muss ich in Java meine Implementierung in einem Header bekanntgeben ? (also nicht nur die Deklaration, sondern sogar deren Definition).

    weil es in java das konzept eines tatsächlichen interfaces gibt. wenn du nicht willst, dass jemand deine implementierung sieht, dann schreibst du deine klasse, übersetzt sie in bytecode und lieferst nur die .class datei aus, inklusive seperatem interface und eines class-loaders.



  • thordk schrieb:

    wenn du nicht willst, dass jemand deine implementierung sieht, dann schreibst du deine klasse, übersetzt sie in bytecode und lieferst nur die .class datei aus...

    http://members.fortunecity.com/neshkov/dj.html
    😉



  • Ob es nur decompiler für Java gäbs *gg* 😉



  • Jester schrieb:

    Mr. N schrieb:

    Es sollte aber sein:

    String a = new String("x");
        String b = new String("x");
    

    Also mit Verlaub, dann klappt zwar das Beispiel, aber die korrekte Übersetzung von std::string a = "x"; nach Java ist String a = "x"; und nix anderes. Du kannst Dich natürlich jetzt noch ein bißchen winden, kannst aber auch einfach zugeben, dass Du es nicht wußtest und Dein Beispiel daher einfach nicht das gezeigt hat was Du zeigen wolltest. 🙂

    Mit Verlaub, die Korrekte Übersetzung ist String a = new String("x"); da in C++ ein NEUER STRING mit Inhalt KOPIE EINES LITERALS (Typ char const []) erzeugt wird. (Korrekterweise gibt es gar keine Übersetzung für den Code, weil String etwas ganz anderes ist als std::string.)

    Was soll ich nicht gewusst haben? Du bist mit einem Java-Vergleich angetanzt, ich habe nur gezeigt, was ich an C++ toll finde.

    Value-Semantik ist toll.



  • thordk schrieb:

    Simon2 schrieb:

    Ich würde gerade einem Javaisten antworten: Warum muss ich in Java meine Implementierung in einem Header bekanntgeben ? (also nicht nur die Deklaration, sondern sogar deren Definition).

    weil es in java das konzept eines tatsächlichen interfaces gibt. wenn du nicht willst, dass jemand deine implementierung sieht, dann schreibst du deine klasse, übersetzt sie in bytecode und lieferst nur die .class datei aus, inklusive seperatem interface und eines class-loaders.

    1.) Wo ist denn (bzgl Sichtbarkeit) der Unterschied zwischen einem "sichtbaren interface" in Java und einer "sichtbaren abstrakten Klasse" in C++ ?
    2.) Wem "implementation hiding via byte code" reicht, sollte sich nicht über sichtbare private-Members in C++ beschweren (damit meine DEvent, der eine entsprechende klage formuliert hat). Das kann man mittels "pimpl" und Maschinencode in C++ mindestens ebenso.

    Gruß,

    Simon2.



  • Mr. N schrieb:

    (Korrekterweise gibt es gar keine Übersetzung für den Code, weil String etwas ganz anderes ist als std::string.)

    😃 👍

    Es handelt sich also um ein Stück Code, das sich ganz unmöglich in Java übersetzen lässt... Leute, wenn ihr also jemals zwei Strings mit Werten belegen wollt... nehmt nicht Java. Das lässt sich damit nicht machen! MrN hat's gesagt.



  • Playstation 3.0 schrieb:

    C++ Strings
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-188380-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
    LOL

    ja, lustig, das ist C++ in reinkultur 👍
    und ihr könnt euch bestimmt vorstellen, wie sowas aussieht, wenn der schwierigkeitsgrad leicht erhöht wird.
    Base64? oder vielleicht UTF-8?
    ... 😃



  • Was du haben willst, geht nur mit Plattformen wie Java oder .NET. Wenn du DAS brauchst, dann steige auf die Sprachen der jeweiligen Plattformen um, die können das.

    Habe ich, seit ca. 6 Jahren.



  • Undertaker schrieb:

    Playstation 3.0 schrieb:

    C++ Strings
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-188380-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
    LOL

    ja, lustig, das ist C++ in reinkultur 👍
    und ihr könnt euch bestimmt vorstellen, wie sowas aussieht, wenn der schwierigkeitsgrad leicht erhöht wird.
    Base64? oder vielleicht UTF-8?
    ... 😃

    UTF-8?

    Glib::locale_to_utf8(std::string);



  • Artchi schrieb:

    Hier im Forum bringt das rum geheule absolut nichts.

    Doch. Manchmal einen gewissen Unterhaltungswert. 🙂


Anmelden zum Antworten