2011-11-04 29 views
13

Ví dụ: trong tệp tiêu đề C++, nếu tôi đã xác định struct Record và tôi muốn sử dụng nó để sắp xếp có thể để tôi muốn quá tải less operator. Dưới đây là ba cách tôi nhận thấy trong mã khác nhau. Tôi gần như nhận thấy rằng: nếu tôi sẽ đặt Record vào một số std::set, map, priority_queue,… vùng chứa, phiên bản 2 hoạt động (có thể là phiên bản 3); nếu tôi sẽ tiết kiệm Record vào một vector<Record> v và sau đó gọi make_heap(v.begin(), v.end()) vv .. sau đó chỉ có phiên bản 1 hoạt động.C++ ít quá tải nhà điều hành, có cách nào để sử dụng?

struct Record 
    { 
     char c; 
     int num; 

     //version 1 
     bool operator <(const Record& rhs) 
     { 
     return this->num>rhs.num; 
     } 

     //version 2 
     friend bool operator <(const Record& lhs, const Record& rhs) //friend claim has to be here 
     { 
     return lhs->num>rhs->num; 
     } 
    }; 

trong file header cùng ví dụ:

 //version 3 
     inline bool operator <(const Record& lhs, const Record& rhs) 
     { 
     return lhs->num>rhs->num; 
     } 

Về cơ bản, tôi muốn ném những câu hỏi vào đây để xem nếu ai đó có thể đưa ra một số tóm tắt những gì là khác biệt giữa ba phương pháp và địa điểm phù hợp cho mỗi phiên bản là gì?

+3

Cải thiện chấp nhận đánh giá của bạn. –

+0

bạn có thể vui lòng đăng các chương trình ví dụ hoàn chỉnh cho từng trường hợp không hoạt động –

+2

Tôi không thấy phiên bản nào –

Trả lời

5

Về cơ bản chúng giống nhau, khác với lần đầu tiên không phải là const và cho phép bạn tự sửa đổi.

tôi thích thứ hai trong 2 lý do:

  1. Nó không phải là một friend.
  2. lhs không phải là một Record
+0

Tôi nghĩ rằng phiên bản thứ 2, nếu bạn yêu cầu toán tử user268451

+0

@ user268451 Nó không phải là một người bạn. Nó thực sự là tốt nhất nếu nó * không phải là * một, vì nó dẫn đến đóng gói tốt hơn. – Pubby

+0

@ Pubby8 Nếu bạn muốn xác định một hàm miễn phí từ bên trong một lớp, bạn sẽ phải thêm 'friend'. Điều này không liên quan gì đến việc truy cập các thành viên riêng tư. – Sjoerd

-4

Ủng hộ trong lớp trừ khi không thể ở trong lớp vì đối số đầu tiên là loại sai.

+2

Thực ra người ta luôn ưu tiên out-of-class, do đó chuyển đổi trên cả hai loại trái và phải áp dụng (và không chỉ là một trong những quyền). Nếu có thể làm cho nó không phải là bạn bè thì tốt hơn nữa, vì nó tách rời toán tử khỏi lớp thực hiện nó chỉ trong giao diện công khai. –

+2

Bạn không muốn chuyển đổi trên các toán tử so sánh trừ khi bạn là một số loại! – Joshua

+1

@ Joshua không phải lúc nào cũng đúng, nếu một số vùng chứa (bản đồ, được sắp xếp, ...) cần nó, bạn có thể triển khai nó cho các lớp "không phải số". – Kashyap

5

Cách tốt nhất để xác định các nhà điều hành ít là:

struct Record{ 
    (...) 
    const bool operator < (const Record &r) const{ 
     return (num < r.num); 
    } 
}; 
+2

Điều này không cho phép chuyển đổi ở phía bên trái, vì vậy chắc chắn không phải là cách tốt nhất *. – Sjoerd

+2

Con đường chuyển đổi ipmlicit là nguy hiểm và bạn sẽ không đi bộ – g24l

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