Ho appena realizzato qualcosa di inquietante. Ogni volta che ho scritto un metodo che accetta std::string
un parametro come parametro, mi sono aperto a comportamenti indefiniti.
Ad esempio, questo ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... può essere chiamato così ...
char* s = 0;
myMethod(s);
... e non c'è niente che io possa fare per prevenirlo (di cui sono a conoscenza).
Quindi la mia domanda è: in che modo qualcuno si difende da questo?
L'unico approccio che viene in mente è quello di scrivere sempre due versioni di qualsiasi metodo che accetta un std::string
come parametro, come questo:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
È una soluzione comune e / o accettabile?
EDIT: Alcuni hanno sottolineato che dovrei accettare const std::string& s
invece std::string s
come parametro. Sono d'accordo. Ho modificato il post. Non penso che cambi la risposta però.
char* s = 0
non fosse definito. L'ho visto almeno alcune centinaia di volte nella mia vita (di solito sotto forma di char* s = NULL
). Hai un riferimento per eseguire il backup?
std:string::string(char*)
costruttore
const std::string&
per quel parametro ...?)
c_str
proprietà dell'oggetto stringa ?