2010-04-30 4 views
0
class MyClass 
{ 
public: 
    void setVar(const char *str); 
private: 
    std::string mStr; 
    int maxLength; //we only store string up to this length 
}; 

Quelle est la meilleure approche pour implémenter setVar lorsque le code externe est susceptible de passer en NULL pour une chaîne vide (et ne peut pas être modifié)? Je fais actuellement quelque chose un peu comme:Meilleure façon de gérer le stockage (éventuellement NULL) char * dans une chaîne std ::

void MyClass::setVar(const char *str) 
{ 
mStr.assign(str ? str : "",maxLength); 
} 

Mais il semble un peu salissant. des idées?

+0

Je suppose que vous allez lire la valeur de la 'chaîne' ailleurs. Est-ce que ce code a besoin d'un 'char const *' ou d'un 'string'? – Thomas

+0

En quoi pensez-vous que c'est désordonné? –

+0

@ Thomas, pourquoi demandez-vous? Je pense que c'est mieux que ma nouvelle classe utilise STL ... en fait je le convertis de stocker des chaînes C parce que cela rend la copie de l'objet beaucoup plus sujette aux erreurs ... un nouveau champ est ajouté et par défaut n'est pas copié ! –

Répondre

4

Le code que vous inscrire est incorrect, car il sera toujours lu maxLength caractères de la chaîne source. En particulier, cela signifie qu'il lira après la fin de la chaîne vide lorsque str est NULL. Cela fonctionnera à la place, en supposant que str est terminé par zéro:

void MyClass::setVar(const char *str) 
{ 
    if (str==NULL) 
     mStr.clear(); 
    else 
     mStr.assign(str, std::min(strlen(str), maxLength)); 
} 
+0

Ouais, je viens de réaliser dans le débogage que string :: assign ne fonctionne pas comme je m'y attendais. –

2
void MyClass::setVar(const char *str) 
{ 
    if (str) { 
     mStr.assign(str, str + std::min(strlen(str), maxLength)); 
    } else { 
     mStr = ""; 
    } 
} 
+0

Qu'y a-t-il avec _str + _std :: min ... –

Questions connexes