2009-03-03 21 views
25

Tôi có một lớp C++ quá tải operator[], toán tử mảng/dấu ngoặc đơn mảng. Điều này là vô cùng thuận tiện bên ngoài lớp học của tôi, nơi tôi có thể viết foo[bar]. Tuy nhiên, tôi không thể tìm ra cách sử dụng ký hiệu này khi tôi đang triển khai phương thức bên trong lớp học của tôi.C++: Cách thuận tiện để truy cập toán tử [] từ bên trong lớp?

Tôi biết tôi có thể viết operator[](bar) hoặc this->operator[](bar) nhưng những điều này khá khó sử dụng và lấy đi rất nhiều tiện ích của nhà điều hành ngay từ đầu. (Tôi cũng biết tôi chỉ có thể thêm một phương thức mới gọi cho nhà điều hành.) Có cách nào tôi có thể viết this[bar] hoặc this->[bar] hoặc một cái gì đó tương tự hay không?

Note: Câu hỏi này cũng có thể áp dụng cho nhiều nhà khai thác unary, nhưng cá nhân tôi chỉ quan tâm đến operator[] (ví dụ, làm thế nào tôi có thể gọi foo++ từ bên trong lớp học?).

Chỉnh sửa: Tôi nhận ra ngay sau khi đăng bài mà tôi có thể sử dụng (*this)[bar]. Tất cả các câu trả lời cho đến nay cũng đã đề xuất điều này. Còn lựa chọn nào nữa ko?

+0

Đã thêm một cú pháp đường cú pháp mà bạn có thể thích (nhưng nó không phải là giải pháp chuẩn) –

Trả lời

39
(*this)[bar]; 

hoạt động tốt cho tôi.

+0

Nếu có bất kỳ giải pháp thay thế nào khác, vui lòng cho tôi biết. Cho đến lúc đó (nếu có), tôi chấp nhận câu trả lời này. Cảm ơn. –

3

Sử dụng

(*this)[bar] 

gọi operator[] của đối tượng dụ.

this[bar] xử lý con trỏ this làm mảng và lập chỉ mục phần tử bar -th (trả về tham chiếu đối tượng có khả năng không hợp lệ).

1

Bạn có thể sử dụng (* this) [thanh], nhưng điều đó có thể không được nhiều sự cải thiện ...

3

Một thay thế cho (*this)[bar] là sử dụng một hàm thành viên mang tên để làm công việc của operator[] . Các toán tử bị quá tải giúp mọi người dễ dàng hơn. Quan trọng hơn, chúng là một phần của giao diện của lớp học. Hãy tự hỏi nếu nó thực sự có ý nghĩa để thực hiện lớp học của bạn về giao diện công cộng của riêng mình. Nếu không, tôi khuyên bạn nên viết một hàm riêng biệt (được bảo vệ hoặc riêng tư) để thực hiện công việc, và sau đó có operator[] và bất kỳ chức năng nào khác gọi nó.

3

Tôi sử dụng hàm at() và yêu cầu toán tử [] gọi hàm at() phía sau hậu trường, do đó toán tử [] chỉ là cú pháp cú pháp. Đó là cách std :: vector hiện nó, do đó, nó có vẻ giống như một cách hợp lý (với ưu tiên) để làm điều đó.

Bây giờ cho một hoàn Hack đường cú pháp (không thể nói tôi hoàn toàn khuyên bạn nên nó nhưng có thể tấn công ưa thích của bạn):

class Widget 
{ 
    Widget&  self; 
public: 
    Widget() :self(*this) 
    {} 

    void operator[](int) 
    { 
     printf("hello"); 
    } 

    void test() 
    { 
     //scripting like sugar 
     //you pay the price of an extra reference per class though 
     self[1]; 
    } 
}; 


int main(int argc, char* argv[]) 
{ 
    Widget w; 
    w[1]; 
    w.test(); 
    return 0; 
} 

Ngoài ra nếu bạn muốn làm điều này miễn phí, mà không phải trả chi phí của tài liệu tham khảo, là một tín đồ của một số phái ác dành riêng để làm lập trình viên bị bạn có thể làm:

#define self (*this) 

Thật sự tôi nghĩ rằng đó là cách xử lý hầu hết được thực hiện trong NS API của Apple ...

+0

Tôi thích điều này, theo nghĩa nào đó, bởi vì cách tôi đã làm nó trong vài phút vừa qua đã được thiết lập tự = * điều này và sau đó sử dụng tự. Cảm ơn. –

+6

Vector là một cách khác xung quanh, vì vector :: at() phải thực hiện kiểm tra phạm vi trước khi gọi toán tử []() – MSalters

1
operator[](bar) 

Điều này cũng hoạt động. Nó làm việc cho tôi!

+0

Trong câu hỏi của tôi, đó là tùy chọn đầu tiên tôi đề cập đến. –

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