Wieso kann man in C++ keine Strings mit Ints verknüpfen?
-
Wenn string auch ints verstehen können soll, dann muß es auch jeden anderen Typen verstehen. Das Konzept von String ist, das es nur mit Strings arbeitet. Wenn man einmal int erlauben würde, müsste man auch jeden anderen Typen erlauben:
class Car { ... }; class Image { ... }; void f() { string s("Hello"); Car car; s += car; // ??? Image image("C:\\test.jpg"); s += image; // ??? }Strings sind aber nunmal nicht dafür gedacht. Es ist auf jeden Fall weiter gedacht, da C++ nunmal eine statisch und typsichere Sprache ist. Wen das stört, muß zu einer anderen Sprache greifen, und gut ist. NIEMAND wird gezwungen C++ zu benutzen, wenn es ihm/ihr nicht gefällt. Das rumgeheule in diesem Thread zeugt nur von Inkompetenz.
-
BarnieGeroellheimer schrieb:
Strings sind aber nunmal nicht dafür gedacht. Es ist auf jeden Fall weiter gedacht, da C++ nunmal eine statisch und typsichere Sprache ist. Wen das stört, muß zu einer anderen Sprache greifen, und gut ist. NIEMAND wird gezwungen C++ zu benutzen, wenn es ihm/ihr nicht gefällt. Das rumgeheule in diesem Thread zeugt nur von Inkompetenz.
Schlimmer: C++ gibt einem sogar die Möglichkeit, Strings anzupassen bzw. selber zu schreiben. Und da wären eben noch die Streams, gegen die sich einige hier prinzipiell zu wehren scheinen

-
Wofür sind Streams eigentlich gedacht?
-
hgfdsa schrieb:
Aber warum ist es dann bei stringstream nicht mehrdeutig? Ist da 0 kein Spezialfall?
Der operator<< ist bei Streams für int überladen. Und das ist eine bessere Entsprechung als long und char*.
-
darthdespotism schrieb:
Und wo bitte ist dann der Unterschied zwischen
double d; std::string str; str += d.to_double();und
double d; std::string str; str += lexical_cast<std::string>(d);?
Ja, hier gibt es keinen, die C++ Lösung sieht sogar eleganter aus. Aber angenommen, in C++ wären integrierte Datentypen Objekte, dann könnten diese eben auch Konvertierungsoperatoren anbieten.
int i; std::string s; s += i; // i wird automatisch zu std::string konvertiertUnd wenn man den Int formatiert haben möchte, geht das über zusätzliche Methoden.
s += i.format(int::format::hex);
...etc.
-
BarnieGeroellheimer schrieb:
Wenn string auch ints verstehen können soll, dann muß es auch jeden anderen Typen verstehen. Das Konzept von String ist, das es nur mit Strings arbeitet. Wenn man einmal int erlauben würde, müsste man auch jeden anderen Typen erlauben:
class Car { ... }; class Image { ... }; void f() { string s("Hello"); Car car; s += car; // ??? Image image("C:\\test.jpg"); s += image; // ??? }Strings sind aber nunmal nicht dafür gedacht. Es ist auf jeden Fall weiter gedacht, da C++ nunmal eine statisch und typsichere Sprache ist. Wen das stört, muß zu einer anderen Sprache greifen, und gut ist. NIEMAND wird gezwungen C++ zu benutzen, wenn es ihm/ihr nicht gefällt. Das rumgeheule in diesem Thread zeugt nur von Inkompetenz.
Das Beispiel zeugt dafür von Kompetenz, weil es ja mit stringstream vollkommen klar wäre, was für Car und Image passieren würde.

-
klar schrieb:
Das Beispiel zeugt dafür von Kompetenz, weil es ja mit stringstream vollkommen klar wäre, was für Car und Image passieren würde.

Dafür wird der operator<< in diesen Klassen überladen, was den praktischen Nebeneffekt hat, dass auch Konsolen- und Dateiausgabe funktionieren. Abgesehen davon finde ich die Benutzung des + bzw += Operators im Zusammenhang mit Strings eh etwas suspekt.
-
.filmor schrieb:
klar schrieb:
Das Beispiel zeugt dafür von Kompetenz, weil es ja mit stringstream vollkommen klar wäre, was für Car und Image passieren würde.

Dafür wird der operator<< in diesen Klassen überladen, was den praktischen Nebeneffekt hat, dass auch Konsolen- und Dateiausgabe funktionieren.
Erst mal wird in dem Beispiel noch garnix überladen. Willst du dann das gleiche auf der Konsole ausgeben wie du in die Datei schreibst? Sehr sinnvoll bei nem Bild.
-
Badestrand schrieb:
BorisDieKlinge schrieb:
test & 5;Das ist ja wohl völlig abwegig. Dann eher lieber spezielle Concetation-Operatoren wie in D (ich glaube '~').
Das wäre dann aber genauso abwegig. '~' ist immerhin auch der Operator für bitweise Negierung. '&' für Konkatenation wäre imo vollkommen ausreichend und im Gegensatz zu '+' auch passender. Ein separater Operator für Konkatenation wäre natürlich am besten, nur sehe ich da keinen, der in Frage kommt. Siehst du einen?
@topic
Dass eine grundlegende String Klasse nur die Verarbeitung von Zeichen und Zeichenketten erlaubt, ist absolut richtig. "hallo" + 42 ergibt jedenfalls wenig Sinn und ist ausdrucksschwach. Wer mehr braucht, sollte auf entsprechende Container mit Formatierung zurückgreifen. Genau das bieten stringstreams.
-
groovemaster schrieb:
'~' ist immerhin auch der Operator für bitweise Negierung.
Nein, das ist der unäre Operator. Du bringst ja auch nicht Dereferenzierung und Multiplikation durcheinander.
-
Naja, nachdenklich macht mich das schon. Wieso sind String und String-Streams in sperate Klassen unterteilt?
Eine kombinierte Klasse würde die meisten Probleme die hier angesprochen wurden doch gut lösen?
-
groovemaster schrieb:
Ein separater Operator für Konkatenation wäre natürlich am besten, nur sehe ich da keinen, der in Frage kommt. Siehst du einen?
Ich hatte ganz vergessen, dass '~' schon vergeben ist

der denker schrieb:
Naja, nachdenklich macht mich das schon. Wieso sind String und String-Streams in sperate Klassen unterteilt?
Eine kombinierte Klasse würde die meisten Probleme die hier angesprochen wurden doch gut lösen?Denk z.B. an die ofstream-Klasse, wenn du dort ein Objekt rein-streamst, wird es anders behandelt als bei einem stringstream.
-
der denker schrieb:
Naja, nachdenklich macht mich das schon. Wieso sind String und String-Streams in sperate Klassen unterteilt?
Eine kombinierte Klasse würde die meisten Probleme die hier angesprochen wurden doch gut lösen?std::stringstream ist doch die Kombination aus std::string und den Streamklassen.
-
Ich kann aber nicht gleichzeitig die Funktionalität des Strings und des Streams nutzen.
-
Doch.
Du kannst dem Stream jederzeit mit
std::stringstream::str(std::string MyString)einen String zuweisen.
-
Nein, das meine ich nicht.
Ich kann aus einem StringStream nur den String holen, nicht aber sofort damit arbeiten, d.h. zB. c_str() auf den StringStream aufrufen.
-
C++ ist perfeckt. Ich weiß gar nicht was es da noch zu disktutieren gibt.
-
..... schrieb:
Nein, das meine ich nicht.
Ich kann aus einem StringStream nur den String holen, nicht aber sofort damit arbeiten, d.h. zB. c_str() auf den StringStream aufrufen.Und was soll so schlimm daran sein? Schreib doch einfach:
std::stringstream MyStream; MyStream.str().c_str();????????? schrieb:
C++ ist perfeckt. Ich weiß gar nicht was es da noch zu disktutieren gibt.
Dein "perfeckt" sagt ja wohl schon alles aus...

-
Das ist natürlich ein Punkt! Dann könnte man ja theoretisch immer nur mit StringStreams arbeiten. Hat das Nachteile oder gibt es Gründe, wieso man darauf verzichten sollte, immer StringStreams statt Strings zu verwenden?
-
Ich kann "der denker" aber schon verstehen. Ich denke, er hätte gerne sowas:
std::string s; s << 10 << "Hallo " << setprecision(3) << 1.234567 << endl;