Để làm rõ những gì tôi đã viết trong một số nhận xét, đây là lý do không để thực hiện việc này trong mã C++.
Có người viết, nói, một lớp chuỗi và quyết định thêm một nhà điều hành đúc để const char*
:
class BadString
{
public:
BadString(const char* s) : mStr(s) { }
operator const char*() const { return mStr.c_str(); }
bool operator==(const BadString& s) { return mStr == s.mStr; }
// Other stuff...
private:
std::string mStr;
};
Bây giờ một người nào đó một cách mù quáng áp dụng mô hình constant == variable
lập trình "phòng thủ":
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
Đây là , IMO, một vấn đề xảo quyệt hơn là phân công ngẫu nhiên bởi vì bạn không thể nói từ trang web cuộc gọi rằng bất kỳ điều gì rõ ràng là sai.
Tất nhiên, những bài học thực là:
- Đừng viết lớp chuỗi của riêng bạn.
- Tránh các toán tử ẩn ngầm, đặc biệt là khi thực hiện (1).
Nhưng đôi khi bạn đang xử lý các API của bên thứ ba mà bạn không thể kiểm soát. Ví dụ, lớp chuỗi _bstr_t
phổ biến trong lập trình Windows COM bị lỗ hổng này.
1 cho một tiêu đề câu hỏi thực sự tốt . – OregonGhost
khá chắc chắn tôi đã nhìn thấy câu hỏi này nhiều hơn một lần, không thể tìm thấy nó ngay bây giờ mặc dù. –
@ Idan: Tôi đã ngạc nhiên vì tôi không thể tìm thấy nó, nhưng sau 5 phút tìm kiếm tôi đã từ bỏ ;-) –