Warum hat C++ so eine aufwendige Syntax?



  • Wenn mans in C++ schön machen will, dann braucht das nunmal zeit, aber im gegensatz zu anderen Sprachen KANN man es schön machen. Und auf schöne Lösungen greift man dann auch gern zurück, wenn sie frei verfügbar sind.



  • Und ich kann mich bei einer "externen" Lib entscheiden _welche_ Lib ich verwende.

    Ich kann mich entscheiden ob ich pthreads will oder boost::thread, ...



  • Mr. N schrieb:

    Wie wärs damit?

    boost::algorithm::to_lower(test);
    

    Ich hab keine Ahnung von boost, aber geht das mit wchar_t? Bei Mr.N kann man da ja nicht sicher sein.

    Mr. N schrieb:

    for (std::size_t i = 0; i < test.size(); ++i)
      test[i] = std::tolower(test[i]);
    
    //oder
    
    for (std::string::iterator it = test.begin(); it != test.end(); ++it)
      *it = std::tolower(*it);
    

    For-Schleife. 🤡

    Und die vierte:

    char safe_tolower(char c) {
      return std::tolower(c);
    }
    
    std::transform(test.begin(), test.end(), test.begin(), &safe_tolower);
    

    Das ist ja schon mal wieder einfaches char. Hat boost keinen eigenen String, wie Java? Die machen doch alles von Java nach.



  • Simon2 schrieb:

    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++ ?

    bezüglich sichtbarkeit gibt es keinen. eine abstrakte klasse verhält sich in c++ sehr ähnlich eines interfaces in java. allerdings liegt ein großer unterschied darin, dass ein java interface keinen zustand kennt, es besitzt keine felder und keinerlei implementierung. es ist tatsächlich lediglich ein interface. gibt in java ja auch abstrakte klassen, deren funktion der in c++ gleicht.

    und wenn man der frage nachgeht, ob man seinen code sofort sichtbar haben möchte oder nicht, ist bytecode + interface die naheliegendste variante. natürlich ist das nicht sicher im klassischen sinne. es ist sogar "unsicherer", als die typische c++ aufteilung in header + lib. wenn man sowas in java möchte, muss man zu erweiterten maßnahmen greifen. oder auf webservices umstellen 😉



  • Hallo

    Eigentlich ist die Syntax von C++ nicht aufwendiger als notwendig, wenn man
    berücksichtigt, daß man alle Typen zur Compilezeit vorgeben muß, was sozusagen die
    bei dynamisch typisierten Sprachen übliche Laufzeit-Typprüfung `in Quellcode zementiert'.

    Eigentlich müßte die C++ Syntax sogar noch umfangreicher sein.

    Schließlich haben etliche Syntaxelemente mehrere verschiedene Bedeutungen:
    static' bedeutet je nach Zusammenhang (globale Var., lokale Var., Klassenattribut) mal dies, mal das,&' kann den Adressoperator bedeuten, dann auch wieder Referenz'*' ist Inhaltsoperator und Multiplikation, das Problem mit der Mehrdeutigkeit von >> in geschachtelten Templates wird vielleicht in C++0x gelöst werden ? usw...

    Gruß



  • thordk schrieb:

    bezüglich sichtbarkeit gibt es keinen. eine abstrakte klasse verhält sich in c++ sehr ähnlich eines interfaces in java. allerdings liegt ein großer unterschied darin, dass ein java interface keinen zustand kennt, es besitzt keine felder und keinerlei implementierung. es ist tatsächlich lediglich ein interface. gibt in java ja auch abstrakte klassen, deren funktion der in c++ gleicht.

    und wenn man der frage nachgeht, ob man seinen code sofort sichtbar haben möchte oder nicht, ist bytecode + interface die naheliegendste variante. natürlich ist das nicht sicher im klassischen sinne. es ist sogar "unsicherer", als die typische c++ aufteilung in header + lib. wenn man sowas in java möchte, muss man zu erweiterten maßnahmen greifen. oder auf webservices umstellen 😉

    Das interessiert mich jetzt aber. Was ist der Unterschied zwischen einer abstrakten Klasse in C++, die keine Implementierung und keine Membervariablen hat (also nur pure virtual Methoden) und einem Interface int Java? Du sagst, daß sich das nur ähnlich verhält, also nicht gleich.



  • Ein Interface(Java) muss in jeder Methode reimplementiert werden, egal wie oft es schon davor vom geerebten Klassen passiert ist.



  • Zeus schrieb:

    Ein Interface(Java) muss in jeder Methode reimplementiert werden, egal wie oft es schon davor vom geerebten Klassen passiert ist.

    Der Satz gibt keinen Sinn. Und wenn es heißen soll, dass das Interface in jder Klasse neue implementiert werden muss, dann nein.



  • 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, soweit geht die Freundschaft leider doch nicht. Aber du kannst deinen Code einmal schreiben und dann die C++/H-Dateien an jeden Compiler übergeben, den du in die Hände bekommst, um eine für dessen System verwertbare LIB zu erhalten.

    @Komplexität:
    Man kann nicht einfach alle unverständlichen und potentiell unsicheren Sprachmittel über Bord werfen und dann behaupten, daß das Ergebnis besser wäre. Einfacher vielleicht, aber bestimmt nicht mächtiger.

    Beispiel const correctness:
    In C++ kann ich recht gut kontrollieren, wer meine Objekte verändern kann und wer nicht. Aber Java-User haben offenbar nicht verstanden, worum es dabei geht und stufen sowas darum als unsinnig ein.

    Beispiel Value-Semantik:
    Ich will nicht sagen, daß es Sinn macht, JEDE Klasse per Wert übergeben zu wollen. Aber genauso wenig macht es Sinn, JEDE Klasse per Referenz zu übergeben. Das bedeutet, wenn ich in Java eine Hilfsstruct benötige (z.B. eine Koordinatenangabe für meine Objekte), muß ich (a) eigene Methoden schreiben, um das Objekt real kopieren zu können und (b) jeden Verwender dieser struct daran erinnern, daß er sie nicht mit = zuweisen darf (wer es doch macht, erhält nichtmal einen Hinweis vom Compiler, daß er Mist gebaut hat). In C++ ist es zwar etwas aufwendiger, einer Klasse Referenzsemantik zu geben - aber das Resultat kann anschließend intuitiv genutzt werden (und der Compiler weist darauf hin, wenn man eine Referenzklasse falsch nutzen will).



  • std::wtf::omg::cryptic schrieb:

    Das is doch gerade das lustige, dass ich für ganz normale Standardsachen eines Entwicklers in C++ oftmals nur 2 Möglichkeiten habe:

    1. es selber saugrausig hinfrickeln
    2. ne externe Lib nehmen

    Beides alles andere als eine elegante Lösung.

    Was sind "normale Standardsachen" ? Ich programmiere hier beruflich viel mit C++ und musste bislang an "externen Libs" nur die Herstellerlibs zur Anbindung an Subsysteme (Hardware oder Software) nehmen - übrigens teilweise Systeme, für die es gar keine Javalibs gibt (Ergo: Geht mit Java GAR NICHT). Einzige Ausnahme: Wir haben eine nette "TimeLib" gefunden (die IMO in C++ wirklich ärgerlicherweise fehlt).
    ... und das ist wahrlich keine "Kleinanwendung".
    Sowohl nach meinem Eindruck als auch nach Aussagen von meinen Javakollegen (die tw. wirklich glühende J-Verehrer und C++-Verachter sind) besteht gerade Javaprogrammierung im wesentlichen in Lib-Recherche: "... irgendeiner hat das bestimmt schon mal geschrieben. Man muss es nur finden." Für ihn war es gerade eine Stärke von Java, dass es so viele Libs gab. (wobei er zugeben musste, dass er nicht weiß, wie viele Libs es für C++ gibt).

    Und "Hinfrickeln" musste ich auch noch nichts. Ich vermute mal, dass Du Deinen speziellen Fokus als "Standard" hinstellst. Dass "für Web- und GUI-Zeugs" Java entwickelt wurde (und deswegen - O Wunder !! - besser passt), ist ja nunmal nicht besonders neu.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Und "Hinfrickeln" musste ich auch noch nichts. Ich vermute mal, dass Du Deinen speziellen Fokus als "Standard" hinstellst. Dass "für Web- und GUI-Zeugs" Java entwickelt wurde (und deswegen - O Wunder !! - besser passt), ist ja nunmal nicht besonders neu.

    Gruß,

    Simon2.

    Hallo Simon2,

    ich muß Dir leider hier ein wenig widersprechen. Für GUI-Zeugs gibt es z.B. Qt und für Web kenne ich auch was 😉 . Ich finde, daß man mit C++ wirklich alles machen kann und es überall passt.



  • thordk schrieb:

    ...
    bezüglich sichtbarkeit gibt es keinen. eine abstrakte klasse verhält sich in c++ sehr ähnlich eines interfaces in java. allerdings liegt ein großer unterschied darin, dass ein java interface keinen zustand kennt, es besitzt keine felder und keinerlei implementierung. es ist tatsächlich lediglich ein interface. gibt in java ja auch abstrakte klassen, deren funktion der in c++ gleicht.

    und wenn man der frage nachgeht, ob man seinen code sofort sichtbar haben möchte oder nicht, ist bytecode + interface die naheliegendste variante. natürlich ist das nicht sicher im klassischen sinne. es ist sogar "unsicherer", als die typische c++ aufteilung in header + lib. wenn man sowas in java möchte, muss man zu erweiterten maßnahmen greifen. oder auf webservices umstellen 😉

    Na, dann sind wir uns doch einig. 😋

    (kleiner "Abzug in der B-Note": Inwieweit hat ein "interface" weniger Zustand als eine analoge abstrakte Klasse ?)

    Gruß,

    Simon2.



  • tntnet schrieb:

    Ich finde, daß man mit C++ wirklich alles machen kann und es überall passt.

    so reden echte fans 👍
    aber leider hat das mit der wirklichkeit nicht viel zu tun.
    tatsächlich sind anwendungsgebiete, in denen C++ sinnvoll ist, sehr selten.
    --> http://www.aristeia.com/Papers/iX interview 0906.pdf
    (kennt ihr sicher schon)
    🙂



  • Undertaker schrieb:

    aber leider hat das mit der wirklichkeit nicht viel zu tun.
    tatsächlich sind anwendungsgebiete, in denen C++ sinnvoll ist, sehr selten.

    Finde ich überhaupt nicht. Klar gibt es gelegentlich Sprachen, die an einer bestimmten Stelle "besser" sind (oder es behaupten), aber C++ ist auf breiter Front einsetzbar.

    --> http://www.aristeia.com/Papers/iX interview 0906.pdf
    (kennt ihr sicher schon)
    🙂

    Kannte ich noch nicht, aber was hat das mit dem Thema zu tun?

    Scott Meyers schrieb:

    C++ wird jedoch auch weiterhin sehr stark auf den Gebieten vertreten bleiben, auf denen die Performance maßgeblich ist, beispielsweise Videospiele, Bildverarbeitung, Finanz-Applikationen (etwa die Echtzeitanalyse von Investitionsmärkten) sowie Simulationen
    diverser Art.



  • Undertaker schrieb:

    tntnet schrieb:

    Ich finde, daß man mit C++ wirklich alles machen kann und es überall passt.

    so reden echte fans 👍
    aber leider hat das mit der wirklichkeit nicht viel zu tun.
    tatsächlich sind anwendungsgebiete, in denen C++ sinnvoll ist, sehr selten.
    --> http://www.aristeia.com/Papers/iX interview 0906.pdf
    (kennt ihr sicher schon)
    🙂

    Darf man anderer Meinung sein, als Scott Meyers? Scott Meyers hat die Behauptung aufgestellt, daß der Einsatzbereich von C++ begrenzt ist ohne es zu begründen. Ich habe mit meinem Tntnet versucht zu beweisen, daß sich C++ auch für die Webprogrammierung hervorragend eignet.



  • CStoll schrieb:

    Kannte ich noch nicht, aber was hat das mit dem Thema zu tun?

    natürlich nichts, ääääh um was geht es hier? 🙄

    CStoll schrieb:

    Scott Meyers schrieb:

    C++ wird jedoch auch weiterhin sehr stark auf den Gebieten vertreten bleiben, auf denen die Performance maßgeblich ist, beispielsweise Videospiele, Bildverarbeitung, Finanz-Applikationen (etwa die Echtzeitanalyse von Investitionsmärkten) sowie Simulationen
    diverser Art.

    ja, wirklich wenige, sehr spezielle gebiete.
    🙂



  • tntnet schrieb:

    Ich habe mit meinem Tntnet versucht zu beweisen, daß sich C++ auch für die Webprogrammierung hervorragend eignet.

    ich glaube, uns ist allen klar, dass man mit C++ fast alles machen kann.
    aber wenn wirtschaftlichkeit eine rolle spielt, ist C++ meistens eine schlechte wahl.
    🙂



  • Ja, das sind die Bereiche, in denen C++ "stark" vertreten ist. Aber in anderen Bereichen, die Java für sich beansprucht, gibt es auch noch genug Möglichkeiten für C++ (z.B. GUI-Programmierung). Und außerdem wissen wir doch alle, wie wichtig Performance ist.



  • tntnet schrieb:

    Undertaker schrieb:

    tntnet schrieb:

    Ich finde, daß man mit C++ wirklich alles machen kann und es überall passt.

    so reden echte fans 👍
    aber leider hat das mit der wirklichkeit nicht viel zu tun.
    tatsächlich sind anwendungsgebiete, in denen C++ sinnvoll ist, sehr selten.
    --> http://www.aristeia.com/Papers/iX interview 0906.pdf
    (kennt ihr sicher schon)
    🙂

    Darf man anderer Meinung sein, als Scott Meyers? Scott Meyers hat die Behauptung aufgestellt, daß der Einsatzbereich von C++ begrenzt ist ohne es zu begründen. Ich habe mit meinem Tntnet versucht zu beweisen, daß sich C++ auch für die Webprogrammierung hervorragend eignet.

    tntnet! Respekt vor deiner Arbeit! 👍 Man muß zusätzlich noch anmerken (was sogar gut für dich ist), das es sogar noch weitere Libraries und Frameworks gibt, die Web-Technik für C++ unetsrtützen.

    Witty (geniale Ajax-Programmierung in C++) und ATL Server (Web und WebServices) von Microsoft, neben tntnet, belegen das es da was gibt. Sogar von einem namhaften Hersteller.

    Und weiterhin ist Amazon.com laut Bjarne Stroustrup in C++ programmiert (bevor jemand sagt, der hat sich das aus den Fingern gesaugt: nein, Amazon.com hat selbst einen Mitarbeiter namens Gary Powell in den ISO-C++-Meetings sitzen). Wer noch behauptet, C++ sei z.B. für Web ungeeignet, ist ein Ignorant.



  • Artchi schrieb:

    Und weiterhin ist Amazon.com laut Bjarne Stroustrup in C++ programmiert

    ebay früher auch mal, aber ich glaub' die haben umgerüstet auf was anderes.
    ...und, ich glaube, google macht auch noch viel mit C++.

    btw: aber ihr müsst bedenken, dass die alle zu zeiten angefangen haben, als es noch nicht viel besseres gab als C++ und wenn man erstmal eine riesige basis aus C++ code hat, ist es schwer, den klotz wieder los zu werden.


Anmelden zum Antworten