Warum hat C++ so eine aufwendige Syntax?
-
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
LOLja, 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
LOLja, 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.

-
std::transform( test.begin(), test.end(), test.begin(), std::bind1st( std::mem_fun( &std::ctype< wchar_t >::tolower ), &std::use_facet< std::ctype< wchar_t > >( std::locale() ) ) );Rofl. So ein widerlicher Code für so ne triviale Sachen. Gott bin ich froh in der Arbeit .NET & C# benutzen zu dürfen.

-
std::wtf::omg:cryptic schrieb:
std::transform( test.begin(), test.end(), test.begin(), std::bind1st( std::mem_fun( &std::ctype< wchar_t >::tolower ), &std::use_facet< std::ctype< wchar_t > >( std::locale() ) ) );Rofl. So ein widerlicher Code für so ne triviale Sachen. Gott bin ich froh in der Arbeit .NET & C# benutzen zu dürfen.

Wie wärs damit?
boost::algorithm::to_lower(test);(Warum kann ich nicht widerstehen und muss reagieren?)
-
Das is doch gerade das lustige, dass ich für ganz normale Standardsachen eines Entwicklers in C++ oftmals nur 2 Möglichkeiten habe:
- es selber saugrausig hinfrickeln
- ne externe Lib nehmen
Beides alles andere als eine elegante Lösung.
-
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:
- es selber saugrausig hinfrickeln
- ne externe Lib nehmen
Beides alles andere als eine elegante Lösung.
Dann benutze kein C++ sondern eine elegantere Sprache.
-
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:
- es selber saugrausig hinfrickeln
- ne externe Lib nehmen
Beides alles andere als eine elegante Lösung.
Davon abgesehen dass man Boost nicht als "externe Lib" bezeichnen kann hast du die dritte Möglichkeit vergessen:
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);
-
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:
- es selber saugrausig hinfrickeln
- ne externe Lib nehmen
Beides alles andere als eine elegante Lösung.
Wo liegt das Problem bei 2)? Nur weil es eine externe Lib ist, ist es doch nicht unelegant. Zumal boost:: ja mittlerweile eh sowas wie eine inoffizielle C++-Standardlib ist. Ob ich mich nun in eine externe Lib oder in eine neue, interne Lib einlesen muss ist doch Jacke wie Hose.
-
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 wiederReferenz'*' 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.