Właśnie zdałem sobie sprawę z czegoś niepokojącego. Za każdym razem, gdy piszę metodę, która przyjmuje parametr std::stringjako parametr, otwieram się na niezdefiniowane zachowanie.
Na przykład to ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... można tak nazwać ...
char* s = 0;
myMethod(s);
... i nie mogę nic na to poradzić (jestem tego świadomy).
Więc moje pytanie brzmi: jak ktoś się przed tym broni?
Jedyne podejście, jakie przychodzi mi na myśl, to zawsze pisać dwie wersje dowolnej metody, która akceptuje std::stringjako parametr, jak poniżej:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Czy jest to powszechne i / lub akceptowalne rozwiązanie?
EDYCJA: Niektórzy zauważyli, że powinienem zaakceptować const std::string& szamiast std::string sparametru. Zgadzam się. Zmodyfikowałem post. Nie sądzę, że to zmienia odpowiedź.
char* s = 0jest niezdefiniowany. Widziałem to co najmniej kilkaset razy w moim życiu (zwykle w formie char* s = NULL). Czy masz odniesienie, aby to zrobić?
std:string::string(char*)konstruktora
const std::string&tego parametru ...?)
c_str?