Đối tương đương với thành ngữ ví dụ của bạn, bạn sẽ xác định operator==
như sau:
friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) {
return (lhs.w == rhs.w) && the rest;
}
friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) {
return !(lhs == rhs);
}
Trong C++ bạn không thường viết một hàm để cho phép ViewMode
đối tượng được so sánh với một cái gì đó mà không có gì ở tất cả để làm với ViewMode
. Tôi giả sử rằng nếu bạn thực sự muốn rằng so với trả về false, chứ không phải là từ chối để biên dịch, sau đó bạn có thể thêm một vài nhà khai thác mẫu (như các chức năng miễn phí, ngoài lớp):
template <typename T>
bool operator==(const ViewMode &, const T&) {
return false;
}
template <typename T>
bool operator==(const T &, const ViewMode&) {
return false;
}
nhưng tôi thực sự don' t đề nghị nó. Thành ngữ Java đó không áp dụng cho C++, bởi vì trong C++ bạn khá nhiều nên không bao giờ có một đối tượng, nhưng không có ý tưởng về kiểu của nó.
Nếu bạn muốn hàm equals của bạn là ảo, thì tốt nhất bạn nên viết hàm ảo equals()
, thay vì sử dụng operator==
cho nó. Bạn sẽ viết nó để lấy một tham số const ViewObject &
, vì vậy không cần bất kỳ tương đương với kiểm tra instanceof
. Đó là chỉ là tốt, bởi vì C + + không có bất kỳ cách nào để có một đối tượng của loại hoàn toàn không rõ và kiểm tra xem nó là một thể hiện của một loại quy định.
Bạn hiếm khi cần một hàm đa hình bằng hàm C++, nhưng nếu bạn đang sử dụng nó trong ví dụ trong std::unordered_map
, thì bạn sẽ chỉ định tham số mẫu bổ sung cho unordered_map
. Cung cấp cho nó một chức năng so sánh bình đẳng mà có hai con trỏ và gọi equals
trên một hoặc khác, và một hàm băm mà làm một cái gì đó hợp lý.
Nguồn
2012-06-11 13:43:26
Tôi đã xóa thẻ 'java' vì một chuyên gia Java không thể trả lời câu hỏi này. –
Đã lâu rồi tôi viết bất kỳ C++ nào nhưng tôi nghĩ rằng bạn sẽ phải quá tải toán tử ==. – ChadNC
Các tab đã làm rối loạn định dạng của bạn. Vì vậy, tôi đã sửa nó cho bạn. – Mysticial