Konvertierungsoperator problem



  • string und wstring kenne ich, es geht nicht darum, sondern würde gern selber ausprobieren, so eine string klasse zu schreiben. ausserdem sizeof string belegt bei mir 28 bytes. das is eine menge. für wstring schätze ich das doppelte.



  • JnZn558 schrieb:

    string und wstring kenne ich, es geht nicht darum, sondern würde gern selber ausprobieren, so eine string klasse zu schreiben. ausserdem sizeof string belegt bei mir 28 bytes. das is eine menge. für wstring schätze ich das doppelte.

    Schätzen ist da nicht angebracht. Ich bezweifle dass wstring so viel größer ist. Und sich um 28 bytes Sorgen zu machen fällt dann doch unter premature optimization.
    Was die selbtegschriebene String-Klasse angeht: da solltest du zum einen die übliche str()-methode anbieten, zum anderen den operator<< für wostreams entsprechend überladen.


  • Administrator

    Es gibt sogar eigentlich gar keinen Grund, wieso ein std::wstring grösser sein soll, als ein normaler std::string . Das eine ist ein std::basic_string<wchar_t> und das andere ein std::basic_string<char> . std::basic_string ist sehr wahrscheinlich nicht spezialisiert und intern haben beide wohl nur einen Zeiger auf ein Array von wchar_t oder char , und ein Zeiger ist ja wohl noch gleichgross. Bei mir gibt sizeof jedenfalls für beide 28 Bytes aus.

    Grüssli



  • Ihr geht leider von thema weg.
    Thema ist: lösung zum problem konvertierungsoperator


  • Administrator

    JnZn558 schrieb:

    Ihr geht leider von thema weg.
    Thema ist: lösung zum problem konvertierungsoperator

    Benutze keinen Konvertierungsoperator, sondern implementiere entsprechende Streamoperatoren, ist deutlich sinnvoller:

    #include <ostream>
    
    class CTest
    {
    private:
      wchar_t* str; // LPWSTR ist WinAPI hat nichts mit C++ zu tun.
    
      // ...
    
      friend std::wostream& operator <<(std::wostream& out, CTest const& test)
      {
        return out << test.str;
      }
    }
    

    Wieso genau der Konvertierungsoperator hier nicht funktioniert, kann ich grad nicht sagen. Müsste ich zuerst im Standard nachlesen gehen. Allerdings verhalten sich der MSVC 2008 und der aktuelle TDM G++ so. Damit ist die Wahrscheinlichkeit gross, dass es im Standard so definiert ist. Ich werde mal ein wenig blättern gehen.

    Grüssli



  • Benutze keinen Konvertierungsoperator, sondern implementiere entsprechende Streamoperatoren, ist deutlich sinnvoller:

    Kommt auf den verwendungzwekc an^^
    Wenn nur ausgegeben werden soll wie hier bringt der echt nix^^

    LPWSTR ist WinAPI hat nichts mit C++ zu tun.

    Vllt. will er das Als eine WinAPI Klasse verwenden und gibt deshalb LPWSTR da an?
    Schonmal dadran gedacht?^^



  • JnZn558 schrieb:

    Ihr geht leider von thema weg.
    Thema ist: lösung zum problem konvertierungsoperator

    Das Problem ist nicht der Konvertierungsoperator sondern das wofür du ihn einsetzen willst. Und für das Problem ist der Konvertierungsoperator der falsche Weg. Die Lösung hab ich dir oben schon geschrieben.



  • Wikinger75 schrieb:

    Kommt auf den verwendungzwekc an^^
    Wenn nur ausgegeben werden soll wie hier bringt der echt nix^^

    natürlich nicht^^
    man will ja immer nur ausgeben, und dafür geht operator<< nicht^^
    lieber gefährliche konvertierungsoperatoren die auch in unerwünschten situationen zu umwandlungen führen^^

    Vllt. will er das Als eine WinAPI Klasse verwenden und gibt deshalb LPWSTR da an?
    Schonmal dadran gedacht?^^

    kein grund das mit std::wstring zu verwenden^^
    und rate mal wofür LPWSTR steht^^



  • typedef WCHAR* LPWSTR

    std::string bzw wstring ist doch auch ein String Klasse;
    und bei der Klassen funktionieren folgendes. funktionieren die auch nur mit operator<< überladung?

    std::wstring test = "Hallo";
    wcout << test << endl;
    

  • Administrator

    JnZn558 schrieb:

    funktionieren die auch nur mit operator<< überladung?

    Ja. std::string und std::wstring haben gar keinen Konvertierungsoperator drin. Wenn man an ein entsprechendes Array rankommen möchte, muss man die Methode c_str oder data verwenden.

    http://www.cplusplus.com/reference/string/operator<</
    http://www.cplusplus.com/reference/string/string/c_str/
    http://www.cplusplus.com/reference/string/string/data/

    Konvertierungsoperatoren werden im allgemeinen in C++ sehr selten genutzt. Die Konvertierung findet nämlich implizit und daher oft unsichtbar statt. Unsichtbare Operationen sind meistens schlecht für die Übersicht.

    Grüssli



  • Konvertierungsoperatoren werden im allgemeinen in C++ sehr selten genutzt. Die Konvertierung findet nämlich implizit und daher oft unsichtbar statt. Unsichtbare Operationen sind meistens schlecht für die Übersicht.
    

    danke sehr, das ist eine ordentliche antwort



  • JnZn558 schrieb:

    danke sehr, das ist eine ordentliche antwort

    ... die ich dir im Übrigen auch schon ganz am Anfang gegebebn hatte:

    pumuckl schrieb:

    Und außerdem würd ich von Konvertierungs-Operatoren absehen sondern lieber eine explizite toString()-Funktion benutzen. Konvertierungsoperatoren können ziemlich unangenehme Überraschungen bereiten (siehe entsprechender Abschnitt hier und/oder Scott Meyers' Effective C++).



  • thx all 4 help


Anmelden zum Antworten