[ERLEDIGT] Strings oder char*



  • Hallo Leute,

    benutzt man in einem C++ Programm noch die guten alten char*?

    Ich würde gerne mal sehen wie diese Funktion:

    void Geoobject::set_comment(const char *new_comment){
    
    	int len = strlen(new_comment);
    
    	if(len > 0 && len < 65534){
    		delete [] this->comment;
    		comment = new char[len+1];
    		comment[len+1] = '\0';
    		strcpy(comment,new_comment);
    	}
    	else{
    		...
    	}
    }
    

    In C++ aussieht.



  • void Geoobject::set_comment(const std::string &new_comment){
      comment = new_comment;
    }
    


  • darkfate schrieb:

    benutzt man in einem C++ Programm noch die guten alten char*?

    So pauschal kann man das nicht sagen. Natürlich benutzt "man" noch Zeiger. Allerdings ist es empfehlenswert Klassen zu verwenden, die einem die SPeicherverwaltung abnehmen.

    void Geoobject::set_comment(const std::string & szNewComment)
    {
        if(!sz.NewComment.isempty() && szNewComment.size() < 65534)
            this->szComment = szNewComment;
        else
        {}
    }
    

    Sieht wesentlich übersichtlicher aus.



  • Danke schonmal für die Antworten.

    Hat die String Klasse eine obere Grenze?



  • darkfate schrieb:

    Hat die String Klasse eine obere Grenze?

    Theoretisch nicht. praktisch wird natürlich irgendwo Ende sein und eine Exception (bad_alloc oder dergleichen) fliegen, das ist allerdings normalerweise weit jenseits der 64k, die du in deiner char*-Version festgenagelt hast.
    Aus dem Grund ist auch die Abfrage in De-Be's Version vom C++-Standpunkt her ebenso unnötig wie die Präfixe für die ungarische Notation.



  • pumuckl schrieb:

    Theoretisch nicht.

    Naja, theoretisch dürfte die Obergrenze bei std::numeric_limits<std::string::size_type>::max() liegen...



  • Hat schon irgendwer erwähnt, dass die set_comment Funktion undefiniertes Verhalten erzeugt?

    comment[len+1] = '\0';
    


  • Braunstein schrieb:

    Hat schon irgendwer erwähnt, dass die set_comment Funktion undefiniertes Verhalten erzeugt?

    comment[len+1] = '\0';
    

    Huch?



  • darkfate schrieb:

    Braunstein schrieb:

    Hat schon irgendwer erwähnt, dass die set_comment Funktion undefiniertes Verhalten erzeugt?

    comment[len+1] = '\0';
    

    Huch?

    Good catch, Braunstein!
    darkfate, Du meintest wohl comment[len] = '\0';
    Es ist aber sowieso überflüssig, da sich strcpy schon um die Nullterminierung kümmert.



  • Braunstein schrieb:

    Hat schon irgendwer erwähnt, dass die set_comment Funktion undefiniertes Verhalten erzeugt?

    comment[len+1] = '\0';
    

    Und das ... dürfte auch nicht kompilieren. 😛



  • Fellhuhn schrieb:

    Braunstein schrieb:

    Hat schon irgendwer erwähnt, dass die set_comment Funktion undefiniertes Verhalten erzeugt?

    comment[len+1] = '\0';
    

    Und das ... dürfte auch nicht kompilieren. 😛

    Da irrst du dich gewaltig, MSVC kompiliert nur so, so und nicht anders 🙂
    Daher dieser Windows Experience.

    Danke für den Hinweis Braunstein 🙂



  • Wie sieht dann get_comment aus? So in etwa?

    std::string const &Geoobject::get_comment() const{
    	return this->comment;
    }
    


  • darkfate schrieb:

    Wie sieht dann get_comment aus? So in etwa?

    std::string const &Geoobject::get_comment() const{
    	return this->comment;
    }
    

    ja. wobei das this-> weggelassen werden kann.


Log in to reply