Wieso kann man in C++ keine Strings mit Ints verknüpfen?
-
das ganze würde weak typing entsprechen
sowas kann man ja machen wenn man php nutztmit strong typing sind implizite casts nicht drin
in python oder ruby geht das auch nicht und das aus gutem grund
sobald man in eine situatuation kommt, wo a==b und b==c jedoch a!=c, bemerkt man, das man ein problem hat
-
ronny schrieb:
das ganze würde weak typing entsprechen
sowas kann man ja machen wenn man php nutztmit strong typing sind implizite casts nicht drin
in python oder ruby geht das auch nicht und das aus gutem grund
sobald man in eine situatuation kommt, wo a==b und b==c jedoch a!=c, bemerkt man, das man ein problem hat
Was hat das jetzt mit dem Problem zu tun? Man muss doch nur den + Operator für Zahlen überladen, da braucht man doch keine casts.
-
ich glaub das einzig Sinnvolle, was man in C++ mit Strings machen kann, ist sich ne eigene Klasse schreiben, die als Wrapper um nen anderen String rum verwendet wird. Dann hat man keine direkten abhängigkeiten zu anderen Frameworks und kann seinen String einfach erweitern. Und man hat nicht sowas wie std::string in seinen Projekt verteilt und 1000 Hilfsfunktionen dazu. Dann kann man auch einfacher auf Unicode umsteigen usw...
-
C++ < Perl

-
schonmal auf die idee gekommen, die + und += operatoren für std::string zu überladen?
std::string& operator+(std::string& str, int i) { std::stringstream ss; ss << i; str += ss.str(); return str; }dann kannst du auch ganz bequem
std::string mystr = "the answer is "; mystr = mystr + 42;schreiben

Zusatz: Es ist imho sogar sehr vernünftig das so zu machen, der Programmierer bekommt die Chance, sich die Dinge so zurecht legen zu können, wie er sie braucht.
und mit ein paar zeilen code kann man das gewünschte verhalten simulieren.
-
hast du auch mal geguckt, was passiert, wenn du das versuchst?
std::string strNull = "Null = "; strNull += 0;jetzt hat dank dir std::string 2 Möglichkeiten:
std::string& std::string::operator += (const char*); std::string& std::string::operator += (int);also wird der Compiler dir direkt sagen, dass du Mist gebaut hast.
ich nehme an, dass die Erfinder von C++ genau aus diesem Grund die Möglichkeit
einen Int anzuhängen weggelassen haben.
-
DrakoXP schrieb:
also wird der Compiler dir direkt sagen, dass du Mist gebaut hast.
Was sogar gut wäre, denn 0 ist kein zulässiges Argument für den const char*-Overload.
Natürlich gibt es viel wichtigere Gründe, keinen solchen Operator für int zu haben.
string ist schon aufgebläht genug. Zudem würde wir dann auch noch Overloads für bool,short,float,double etc. haben wollen. Und spätestens (eigentlich von vornherein) stellt sich bei Gleitkommazahlen die Frage nach der Formatierung. Wollte man hier Freiheiten haben, müsste man zusätzliche Informationen im string speichern. Nicht zuletzt haben wir bereits streams. Wozu sollten wir noch eine zusätzliche (übergewichtige) Klasse brauchen, die die gleiche Funktionalität bietet?
-
DrakoXP schrieb:
hast du auch mal geguckt, was passiert, wenn du das versuchst?
std::string strNull = "Null = "; strNull += 0;jetzt hat dank dir std::string 2 Möglichkeiten:
std::string& std::string::operator += (const char*); std::string& std::string::operator += (int);also wird der Compiler dir direkt sagen, dass du Mist gebaut hast.
std::stringstream stream; stream << "NULL = "; stream << 0; std::cout<<stream.str();Warum geht das bei stringstream aber nicht bei string?
-
hgfdsa schrieb:
Warum geht das bei stringstream aber nicht bei string?
DrakoXP täuscht sich hier. Eine solche Überladung führt nicht zu Mehrdeutigkeiten, wenn das Argument 0 ist, da habe ich auch nicht aufgepasst.
-
stimmt, weil int naheliegender ist als char*.
das Problem entstht, wenn man statt int long, short, char oder long long verwendet,
weil die mit char* gleichwertig sind.
-
DrakoXP schrieb:
stimmt, weil int naheliegender ist als char*.
das Problem entstht, wenn man statt int long, short, char oder long long verwendet,
weil die mit char* gleichwertig sind.Wieso sollen diese Typen gleichwertig mit char* sein, int aber nicht? Die wären wohl eher mit int gleichwertig; denn wenn man z.b. folgendes schreibt, weiss der Compiler nicht, ob es ein short, long, char oder was auch immer ist; ich denke, er nimmt einfach int an... Aber char* wird er wohl als letztes annehmen, oder irre ich mich?
0;
-
camper schrieb:
hgfdsa schrieb:
Warum geht das bei stringstream aber nicht bei string?
DrakoXP täuscht sich hier. Eine solche Überladung führt nicht zu Mehrdeutigkeiten, wenn das Argument 0 ist, da habe ich auch nicht aufgepasst.
std::string& operator+(std::string& str, int i) { std::stringstream ss; ss << i; str += ss.str(); return str; } int main(int argc, char** argv) { int i = 0; std::stringstream stream; stream << "NULL = "; stream << i; //geht stream << 0; //geht std::cout<<stream.str(); std::string strNull = "Null = "; strNull += i; //geht strNull += 0; //geht nicht return 0; }Mit Visual Studio 2008 kompiliert das letzte aber nicht
error C2593: 'Operator +=' ist mehrdeutig
Warum?
-
There is a hell in C++ with this NULL pointer!
I think NULL should be forbidden in new standard and it should be used something like
null<char *>for zero pointers of typechar *.For example, in Pascal the zero pointer is
nilwhich is not equvalent to 0.
-
0 ist ein Spezialfall. Das ist ein int, aber genauso weit von den anderen Ganzzahltypen entfernt wie von Zeigertypen. Das gilt nur für die 0, mit anderen Ganzzahlkonstanten funktioniert das nicht (unter anderem auch nicht mit 0l, aber mit 0u).
-
hgfdsa schrieb:
std::string& operator+(std::string& str, int i) { std::stringstream ss; ss << i; str += ss.str(); return str; }operator+modifies the first argument? This is not good. It should bestd::string& const str.
-
SAn schrieb:
It should be
std::string& const str.Du meinst wohl / you certainly mean:
std::string const& strAber ich würde sowieso schreiben / However, I would write:
const std::string &strSoll ich eigentlich deutsch oder englisch schreiben? Hab mal beides gemacht

-
Wieso kann man bei einem Stringstream Ints reinpacken, bei einem String aber nicht?
Und wieso haben Stringstreams diese Fähigkeit bekommen, nicht aber Strings?Keine Sau braucht Stringsstreams! (Eigentlich nur, um den Pfusch an std::string zu umfrickeln!)
-
Skandal! schrieb:
Wieso kann man bei einem Stringstream Ints reinpacken, bei einem String aber nicht?
Und wieso haben Stringstreams diese Fähigkeit bekommen, nicht aber Strings?Keine Sau braucht Stringsstreams! (Eigentlich nur, um den Pfusch an std::string zu umfrickeln!)
StringStreams sind ziemlich nützlich. Nur weil du sie nicht genug kennst, heisst das nicht, dass sie niemand braucht.
std::stringwurde für Zeichenketten und Operationen wie Teilstrings, Aneinanderreihungen, Zeichensuche etc. konzipiert. Soviel zum Pfusch.
Die Anhängung von beliebigen Datentypen würde den (sonst schon grossen) Umfang der string-Klasse noch stark erweitern. Das wäre überflüssig, weil man die Verbindung mit irgendwelchen Typen kaum braucht. Wenn doch, nimmt man dafür eben Streams. Was spricht dagegen?Ausserdem ist es jedem überlassen, seine eigene Stringklasse zu schreiben oder von
std::string zu erben. C++ bietet einem ja diese Möglichkeit.
-
Aneinanderreihungen... aber wieso nicht auch Aneinanderreihungen von ints!!
Die Begründung, dass es weak typing wäre, kann ich grad noch so akzeptieren.
Trotzdem ist es im Alltag sehr hinderlich.Und ich muss sagen, es wäre für mich als Benutzer der Sprache weniger Overhead,
wenn die String-Klasse ints aufnehmen könnte, anstatt noch eine weitere Klasse
zu instanzieren und mit zusätzlichen Code eben das zu erreichen.
-
Aber warum ist es dann bei stringstream nicht mehrdeutig? Ist da 0 kein Spezialfall?
PS:
Nexus schrieb:
oder von std::string zu erben. C++ bietet einem ja diese Möglichkeit.
Nein http://www.c-plusplus.net/forum/viewtopic-var-t-is-211691.html