Saya baru saja menyadari sesuatu yang mengganggu. Setiap kali saya menulis metode yang menerima std::string
sebagai parameter, saya membuka diri terhadap perilaku yang tidak jelas.
Sebagai contoh, ini ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... bisa disebut seperti ini ...
char* s = 0;
myMethod(s);
... dan tidak ada yang bisa saya lakukan untuk mencegahnya (yang saya sadari).
Jadi pertanyaan saya adalah: Bagaimana seseorang mempertahankan diri dari hal ini?
Satu-satunya pendekatan yang terlintas dalam pikiran adalah untuk selalu menulis dua versi dari metode apa pun yang menerima std::string
parameter, seperti ini:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Apakah ini solusi yang umum dan / atau dapat diterima?
EDIT: Beberapa telah menunjukkan bahwa saya harus menerima const std::string& s
alih-alih std::string s
sebagai parameter. Saya setuju. Saya memodifikasi posting. Saya tidak berpikir itu mengubah jawabannya.
char* s = 0
tidak terdefinisi. Saya telah melihatnya setidaknya beberapa ratus kali dalam hidup saya (biasanya dalam bentuk char* s = NULL
). Apakah Anda memiliki referensi untuk mendukungnya?
std:string::string(char*)
konstruktor
const std::string&
parameter untuk itu ...?)
c_str
properti objek string ?