Tôi vừa nhận ra một điều đáng lo ngại. Mỗi lần tôi viết một phương thức chấp nhận std::stringnhư một tham số, tôi đã tự mở ra hành vi không xác định.
Ví dụ, điều này ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... có thể được gọi như thế này ...
char* s = 0;
myMethod(s);
... Và tôi không thể làm gì để ngăn chặn điều đó (mà tôi biết).
Vì vậy, câu hỏi của tôi là: Làm thế nào một người bảo vệ chính họ khỏi điều này?
Cách tiếp cận duy nhất nảy ra trong đầu là luôn viết hai phiên bản của bất kỳ phương thức nào chấp nhận std::stringmột tham số, như thế này:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
Đây có phải là một giải pháp phổ biến và / hoặc chấp nhận được?
EDIT: Một số người đã chỉ ra rằng tôi nên chấp nhận const std::string& sthay vì std::string snhư một tham số. Tôi đồng ý. Tôi đã sửa đổi bài viết. Tôi không nghĩ rằng thay đổi câu trả lời mặc dù.
char* s = 0là không xác định. Tôi đã nhìn thấy nó ít nhất vài trăm lần trong đời (thường ở dạng char* s = NULL). Bạn có một tài liệu tham khảo để sao lưu đó?
std:string::string(char*)xây dựng
const std::string&tham số đó không ...?)
c_strtính của đối tượng chuỗi không?