2010-10-04 29 views
5

Tôi đã quá tải [] nhà điều hành trong lớp học của tôi Interval trở phút hoặc giây.Quá tải toán tử subscript "[]" trong l-giá trị và r có giá trị trường hợp

Nhưng tôi không chắc chắn cách chỉ định giá trị cho phút hoặc giây thứ hai bằng toán tử [].

Ví dụ: Tôi có thể sử dụng báo cáo này

cout << a[1] << "min and " << a[0] << "sec" << endl;

nhưng tôi muốn quá tải toán tử [], vì vậy mà tôi thậm chí có thể gán giá trị cho phút hoặc giây sử dụng

a[1] = 5; 
a[0] = 10; 

My mã:

#include <iostream> 

using namespace std; 

class Interval 
{ 

public: 

    long minutes; 
    long seconds; 

    Interval(long m, long s) 
    { 
     minutes = m + s/60; 
     seconds = s % 60; 
    } 

    void Print() const 
    { 
     cout << minutes << ':' << seconds << endl; 
    } 

    long operator[](int index) const 
    { 
     if(index == 0) 
      return seconds; 

     return minutes; 
    } 

}; 

int main(void) 
{ 
    Interval a(5, 75); 
    a.Print(); 
    cout << endl; 

    cout << a[1] << "min and " << a[0] << "sec" << endl; 
    cout << endl; 

} 

I biết tôi phải khai báo các biến thành viên là riêng tư, nhưng tôi đã tuyên bố ở đây là công khai chỉ vì sự thuận tiện của tôi.

+7

có vẻ như một ví dụ khủng khiếp về quá tải của nhà điều hành vì lợi ích của nó. Bạn có một số yêu cầu tối nghĩa buộc bạn phải làm điều này? Nếu không nó chỉ là obfuscation mã. – jalf

+0

@ jalf Tôi biết đó là một ví dụ khủng khiếp, nhưng tôi muốn quá tải toán tử [] trong lớp chung cho Object Array. – Searock

+0

@jalf: tại sao http://cpp.sh/4fiz hoạt động mà không có bất kỳ lỗi trình biên dịch nào? Không nên trình biên dịch ném một lỗi? Nó không mang lại kết quả gì. Điều gì là chính xác xảy ra trong chương trình này. – Destructor

Trả lời

10

Return một tham chiếu đến các thành viên trong câu hỏi, thay vì giá trị của nó:

long &operator[](int index) 
{ 
    if (index == 0) 
     return seconds; 
    else 
     return minutes; 
} 
+0

Thật tuyệt vời! câu trả lời này rất rõ ràng và súc tích. – ZoomIn

3

trả về bằng tham chiếu để có thể gán giá trị và sử dụng chúng trên LHS của toán tử gán.

+0

Tôi là người mới bắt đầu trong C++, vì vậy bạn có thể cho tôi một ví dụ không? – Searock

+2

@Searock xin lỗi tôi sắp thêm ví dụ. Chỉ cần chú ý Vijay đã thêm đoạn mã. Vui lòng tham khảo điều đó. Nói chung trong C++ nếu bạn muốn có thể sử dụng giá trị được trả về bởi hàm toán tử overriden của bạn trên LHS của nhiệm vụ thì bạn nên quay trở lại bằng cách tham chiếu trong hàm toán tử overriden của bạn. –

6

quá tải op [] để sử dụng mã hóa cứng "chỉ số" giá trị không có ý nghĩa ở đây, và bạn thực sự đã có những giải pháp trong định nghĩa lớp học của bạn:

cout << a.minutes << "min and " << a.seconds << "sec" << endl; 

Bạn có thể bật những thành phương pháp thay vì công dữ liệu thành viên, đó là không quan trọng cho không quá tải op []. Tuy nhiên, vì bạn cũng muốn có quyền ghi, ưu điểm duy nhất mà phương thức sẽ có là xác thực (ví dụ: kiểm tra 0 < = giây < 60).

struct Interval { 
    int minutes() const { return _minutes; } 
    void minutes(int n) { _minutes = n; } // allows negative values, etc. 

    int seconds() const { return _seconds; } 
    void seconds(int n) { 
    if (0 <= n and n < 60) { 
     _seconds = n; 
    } 
    else { 
     throw std::logic_error("invalid seconds value"); 
    } 
    } 

    // rest of class definition much like you have it 

private: 
    int _minutes, _seconds; 
}; 

// ... 
cout << a.minutes() << "min and " << a.seconds() << "sec" << endl; 
+0

Tôi biết nó không có ý nghĩa gì, nhưng tôi vẫn nên làm gì Nếu tôi muốn gán giá trị bằng toán tử []. – Searock

+3

@Searock: Một câu trả lời khác đề cập đến nó, nhưng tôi sẽ không đề xuất nó như một giải pháp cho vấn đề này. –

+0

@Roger Pate +1 Tôi biết đây là một ví dụ ngu ngốc rất lớn nhưng nó chỉ là để rõ ràng nghi ngờ của tôi, thưa bà của tôi nói với tôi rằng quá tải [] nhà điều hành để gán là không thể. – Searock

8

Thay đổi chức năng chữ ký bằng cách loại bỏ các const và trả về một tài liệu tham khảo:

long& operator[](int index) 

Bây giờ bạn sẽ có thể viết những câu như:

a[0] = 12; 
+6

Đừng quên quá tải const của op []. –

+5

Tức là, đừng xóa cái hiện có. * Thêm * cái này. – visitor

+1

+1 Tôi ước gì tôi cũng có thể đánh dấu bài đăng của bạn là một câu trả lời. – Searock

3

chuyển đổi phương pháp để như được đưa ra dưới đây nên làm điều đó:

long& operator[](int index) 
1

mảng điều hành viên chỉ số của bạn nên được cung cấp như

long& operator[](int index);     // for non const object expressions 

long const& operator[](int index) const;  // for const object expressions 
1

In-trật tự để tránh nhầm lẫn trong trường hợp quá tải toán tử sub-script, bạn nên sử dụng phiên bản constnon-const của toán tử tập lệnh con.

long& operator[](int index); // non-const function returning reference 

long const& operator[](int index) const;// const function returning const reference 

Với A[1] = 5, bạn đang cố gắng sửa đổi đối tượng tại index 1.Vì vậy, phiên bản không const của toán tử sub-script sẽ được gọi tự động.

Với cout << A[1], bạn không sửa đổi đối tượng tại index 1. Vì vậy, phiên bản const của toán tử sub-script sẽ được gọi tự động.