Wieso kann man in C++ keine Strings mit Ints verknüpfen?



  • 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;
    


  • Nimm boost::format.



  • Badestrand schrieb:

    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;
    

    Kann man dazu den << Operator nicht überladen?



  • man könnte einfach immer auf stringstreams setzen! spricht da jetzt was dagegen oder nicht?
    mir fällt jedenfalls nichts ein!



  • Bashar schrieb:

    groovemaster schrieb:

    '~' ist immerhin auch der Operator für bitweise Negierung.

    Nein, das ist der unäre Operator.

    Und nachts ist es kälter als draussen. 🙂 Ob unär oder nicht ist bezugslos zu meiner Aussage. '~' ist und bleibt ein Operator.



  • Nexus schrieb:

    Badestrand schrieb:

    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;
    

    Kann man dazu den << Operator nicht überladen?

    Klar kann man das, will man aber nicht 🙂 Es wäre halt schön (habe jetzt aber auch nicht alle Konsequenzen bedacht), wenn sowas im Standard-Krams wäre.

    der streamer schrieb:

    man könnte einfach immer auf stringstreams setzen! spricht da jetzt was dagegen oder nicht?
    mir fällt jedenfalls nichts ein!

    Ne, ist nicht praktikabel, einer der Gründe:

    void foo( std::stringstream& s );
    
    std::stringstream a("Hallo"), b("Welt");
    foo( a + b ); //<- kompiliert nicht
    


  • lass mich mal überlegen..

    void foo( std::string& s );
    
    std::string a("Hallo"), b("Welt");
    foo( a + b );
    

    das wäre ja sonst das äquivalent dazu, ich erzeuge mir also einen temporären string aus a und b.
    dann müsste doch theoretisch auch das hier funktionieren:

    void foo( std::stringstream& s );
    
    std::stringstream a("Hallo"), b("Welt");
    foo( a.str() + b.str() );
    

Anmelden zum Antworten