2012-12-03 8 views
5

Nói chung, làm thế nào để bạn khai báo chỉ mục toán tử [ ] của một lớp cho cả quyền truy cập đọc và ghi?C++: Quá tải toán tử [] để đọc và ghi truy cập

tôi đã cố gắng một cái gì đó giống như

/** 
* Read index operator. 
*/ 
T& operator[](T u); 

/** 
* Write index operator 
*/ 
const T& operator[](T u); 

mang đến cho tôi những lỗi

../src/Class.h:44:14: error: 'const T& Class::operator[](T)' cannot be overloaded 
../src/Class.h:39:8: error: with 'T& Class::operator[](T)' 

Trả lời

14

phiên bản có thể thay đổi của bạn là tốt:

T& operator[](T u); 

nhưng phiên bản const phải là một chức năng const thành viên cũng như trở về một tham chiếu const:

const T& operator[](T u) const; 
         ^^^^^ 

Điều này không chỉ phân biệt nó với người kia quá tải, nhưng cũng cho phép (chỉ đọc) truy cập vào const trường hợp của lớp học của bạn. Nói chung, các hàm thành viên quá tải có thể được phân biệt bởi các kiểu tham số của chúng và các điều kiện const/volatile, nhưng không phải là theo kiểu trả về của chúng.

6

Bạn chỉ cần có một tình trạng quá tải sẽ được sử dụng cho cả đọc và viết:

T& operator[](int); 

Có nói rằng, bạn cũng có thể muốn có quá tải const:

const T& operator[](int) const; 

Điều này sẽ cung cấp chỉ mục chỉ đọc vào const trường hợp của lớp học của bạn.

+0

Chỉ cần thêm giải thích thêm, điều này là do quá tải toán tử trả về tham chiếu đến đối tượng. Điều này cho phép bạn gán cho nó cũng như đọc nó, do đó chỉ cần một quá tải. – Chris

2

Bạn gặp lỗi, vì chức năng quá tải không thể chỉ khác nhau theo kiểu trả về. Nhưng chúng có thể khác nhau bởi const-ness.

/** 
* Write index operator. 
*/ 
T& operator[](T u); 

/** 
* Read index operator 
*/ 
const T& operator[](T u) const; 

Lưu ý các vị trí được đổi "viết" và "đọc".

Ngoài ra, bạn không thực sự có nghĩa là đối số của toán tử là một loại không thể thiếu?