Mir ist gerade etwas Störendes aufgefallen. Jedes Mal, wenn ich eine Methode geschrieben habe, die a std::string
als Parameter akzeptiert , habe ich mich für undefiniertes Verhalten geöffnet.
Zum Beispiel ist dies ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... kann man so nennen ...
char* s = 0;
myMethod(s);
... und ich kann nichts dagegen tun (was mir bewusst ist).
Meine Frage lautet also: Wie verteidigt sich jemand dagegen?
Der einzige Ansatz, der in den Sinn kommt, besteht darin, immer zwei Versionen einer Methode zu schreiben, die einen std::string
als Parameter akzeptiert , wie folgt :
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Ist das eine gängige und / oder akzeptable Lösung?
EDIT: Einige haben darauf hingewiesen, dass ich const std::string& s
statt std::string s
als Parameter akzeptieren sollte . Genau. Ich habe den Beitrag geändert. Ich denke nicht, dass dies die Antwort ändert.
char* s = 0
das undefiniert ist. Ich habe es mindestens ein paar hundert Mal in meinem Leben gesehen (normalerweise in Form von char* s = NULL
). Haben Sie eine Referenz, um das zu sichern?
std:string::string(char*)
Konstrukteur
const std::string&
für diesen Parameter keine nehmen können ...?)
c_str
Eigenschaft des Zeichenfolgenobjekts nicht überprüfen konnten ?