2012-06-11 44 views
7

Có điều gì đó giống như Java equals() không? Để so sánh nếu đối tượng là cùng loại?Có tương đương với phương thức Java bằng C++ không?

public boolean equals(Object obj) { 
    if (obj == null || !(obj instanceof ViewMode)) { 
     return false; 
    } 

    ViewMode dm = (ViewMode) obj; 
    return dm.width == w 
     && dm.h == h 
     && dm.b == b 
     && dm.f == f; 
} 

public int hashCode() { 
    return w^h^f^b ; 
} 
+3

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. –

+2

Đã 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

+0

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

Trả lời

12

Không. C++ không có kiểu mô hình kiểu toàn cầu như Java. Không có loại Object mà từ đó tất cả các loại khác được kế thừa, do đó không có phương pháp nào (như equals) được xác định cho tất cả các lớp.

C++ cung cấp một khuôn khổ để xây dựng mô hình kiểu có phép so sánh chung: operator ==. Đó là vào bạn để xây dựng ra tất cả các triển khai này trong tất cả các lớp học của bạn để họ tương tác một cách chính xác. Nhưng không có triển khai mặc định nào có thể so sánh được với Object.equals.

+2

Như một lưu ý nữa, thành ngữ C++ * thường * không yêu cầu downcasting từ một lớp cơ sở nhiều như Java. –

+1

"không có phương thức nào (như bằng) được định nghĩa cho tất cả các lớp" - bạn có thể tạo một trường hợp cho toán tử đơn nhất & '(" address-of ") được định nghĩa cho mọi thứ, nhưng đó chỉ là pedantry ;-) –

5

Bạn có thể xác định operator== trong lớp học của mình.

0

Bạn có thể sử dụng toán tử typeid cho việc này.

13

Đố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ý.

+0

, Tôi đã quên điều đó. –

Các vấn đề liên quan