2011-01-01 29 views
7

Tôi đang viết một lớp sưu tập. Tôi muốn quá tải toán tử dấu ngoặc vuông ([]) để cung cấp quyền truy cập vào các phần tử trong bộ sưu tập.Quá tải Toán tử dấu ngoặc vuông để chấp nhận giá trị

int operator[](int i) 
{ 
    // Do stuff here 
} 

Vấn đề của tôi là tôi không thấy làm thế nào để viết những dòng này để tôi có thể sử dụng toán tử này để chấp nhận một giá trị:

myClassInstance[0] = value; 

tôi thấy không có cách nào để khai báo các nhà điều hành dấu ngoặc vuông với một đối số bổ sung (giá trị để gán cho phần tử).

Tôi biết tôi chỉ đơn giản có thể trả về int & và người gọi có thể gán giá trị cho điều đó, nhưng nội bộ mỗi phần tử được lưu trữ ở định dạng khác với định dạng được công khai.

Điều này có thể thực hiện được không?

+0

bạn cần hai operator [] (int) phiên bản. một phiên bản const và phiên bản không phải là const mà bạn đã yêu cầu. Phiên bản gốc nên có const phía sau nó, để gọi trên một đối tượng const; –

+0

@Edwin: Tôi đã thấy nhận xét khác của bạn. Tôi sẽ cho nó đi. Cảm ơn. –

Trả lời

9

Viết int_proxy lớp có thể chuyển đổi hoàn toàn thành int và có thể chuyển nhượng từ int. Bạn sẽ cần ít nhất hai chức năng thành viên:

operator int(); 
int_proxy& operator=(int); 

Trong lớp proxy này, lưu trữ bất kỳ thông tin nào bạn cần để có thể truy xuất và đặt giá trị trong vùng chứa. Thực hiện truy xuất trong toán tử chuyển đổi và phép gán trong toán tử gán.

+1

Bạn quên đề cập rằng toán tử int ban đầu [] (int) phải có một công cụ sửa đổi const, cho phép nó được gọi trên các đối tượng const. –

+0

Tôi nghĩ tôi có thể làm điều này đơn giản hơn thế. Nhưng nó không giống như nó. Cảm ơn! –

+0

@Edwin: Có cách nào để làm cho nó có thể đọc một đối tượng 'const' bằng cách sử dụng' [] ', và cả đọc và viết một đối tượng không const sử dụng cùng một toán tử? – supercat

2

Trả lại tham chiếu đến đối tượng có toán tử = để có thể nhập nội dung cần tìm. Hãy xem xét thủ thuật vector boolean trong STL cho một ví dụ, nếu không nhất thiết là một ví dụ điển hình tuyệt vời.

1

viết:

int& operator[](int i) 
    { 
     // Do stuff here 
    } 
Các vấn đề liên quan