Wie kann ich dieses "Objekt" in einern String umwandeln?



  • Hallo!

    Ich hab mir was aus Codeschnipseln zusammengebaut.
    Und zwar wollte ich die Laufzeit eines bestimmten Codeteils messen. (Es ging um eine Bubblesort - ist aber unwichtig)

    Das Ganze funktioniert mit diesem Uhr-"Objekt":

    Uhr uhr;
    {
      Uhr::Stopper stopper( uhr ); 
      // Anweisungen deren Laufzeit gemessen werden soll
    }
    cout << uhr << endl;
    

    Hier die dazugehörige Klasse:

    class Uhr 
    { 
    public: 
        struct Stopper 
        { 
            explicit Stopper( Uhr& uhr ) 
                : m_uhr( uhr ) 
            { 
                m_uhr.m_start = clock(); 
            } 
            ~Stopper() 
            { 
                m_uhr.m_dauer = clock() - m_uhr.m_start; 
            } 
        private: 
            Uhr& m_uhr; 
        }; 
    
        friend struct Stopper; 
    
        friend std::ostream& operator<<( std::ostream& out, const Uhr& uhr ) 
        { 
            return out << double( uhr.m_dauer ) / double( CLOCKS_PER_SEC ) << 's'; 
        } 
    
    private: 
        clock_t m_start; 
        clock_t m_dauer; 
    };
    

    Nun meine Frage: Ich möchte jetzt den Wert von "uhr" in einem String speichern?
    Die Ausgabe in einerm Stream funtioniert ja schon (cout << uhr << endl;).
    Ich hab es sich mit folgendem ausprobiert:
    string s = "" + uhr;
    string s = string(uhr);

    Ihr seht ich habe fast keine Ahnung von C++.

    Wäre echt super wenn ihr mir helfen könntet.

    MfG
    Fabian



  • so könnt's klappen

    Uhr uhr;
       std::stringstream ss;
       ss << uhr;
       std::string s = ss.str();
    

    für stringstream <sstream> includen



  • Hey super. Scheint zu funktionieren!



  • Und wenn du es einfacher haben willst, pack' diesen Code in einen Uhr::operator const string&(). Dann kannst du den Wert einfach mit "string s=uhr;" übernehmen.

    (aber ich würde dafür eher doubles verwenden - da kannst du dann noch zwei Messungen direkt gegeneinander vergleichen)



  • CStoll schrieb:

    Und wenn du es einfacher haben willst,

    .. dann nutze boost's lexical_cast (siehe http://www.boost.org/libs/conversion/lexical_cast.htm). Etwa

    std::string s = boost::lexical_cast< std::string >( uhr );
    

    CStoll schrieb:

    pack' diesen Code in einen Uhr::operator const string&(). Dann kannst du den Wert einfach mit "string s=uhr;" übernehmen.

    genau das sollte man nicht tun; steht auch irgendwo bei Scott Meyers.

    Die Frage (an den OP) ist eher: was geschieht mit dem string, wenn die 'uhr' drin ist. Kann man es nicht sofort via Ausgabe an den Zielort streamen?

    Gruß
    Werner


Anmelden zum Antworten