2010-03-28 35 views
8

Tôi muốn quá tải operator[][] để cấp quyền truy cập nội bộ vào mảng 2D của char trong C++.toán tử [] [] C++

Ngay bây giờ tôi chỉ quá tải operator[], mà đi một cái gì đó giống như

class Object 
{ 
    char ** charMap ; 
    char* operator[](int row) 
    { 
     return charMap[row] ; 
    } 
} ; 

Nó hoạt động ok .. Có thể ghi đè operator[][] mặc dù?

+8

Không có toán tử [] [] trong C++. –

+1

Quá tải mảng bị trả về bởi quá tải [] OH SHI- –

Trả lời

18

Đừng cố gắng làm điều đó - như những người khác đã nói, quá tải operator [] cách bạn thực sự cung cấp cú pháp [][] miễn phí. Nhưng đó không phải là một điều tốt.

Ngược lại - nó phá hủy sự đóng gói và ẩn thông tin trong lớp của bạn bằng cách chuyển chi tiết triển khai - con trỏ char* - sang bên ngoài. Nói chung, điều này không được khuyến khích.

Phương pháp tốt hơn là triển khai operator [,], cần nhiều hơn một đối số hoặc thực sự là operator [][]. Nhưng không tồn tại trong C++.

Vì vậy, thông thường cách làm này là để mương operator [] hoàn toàn cho nhiều hơn một thứ nguyên. Giải pháp thay thế sạch là sử dụng operator() thay vì đó điều hành thể có nhiều hơn một đối số:

class Object 
{ 
    char ** charMap ; 
    char& operator()(int row, int column) 
    { 
     return charMap[row][column]; 
    } 
}; 

Để biết thêm thông tin, vui lòng xem bài viết trong C++ FAQ Lite.

+2

+1 để đề xuất 'toán tử()' – missingfaktor

+2

Câu trả lời của bạn tăng điểm, nhưng toán tử hỗ trợ [] không cần hủy bỏ đóng gói - thay vì trả về con trỏ, bạn có thể trả về đối tượng proxy hỗ trợ toán tử [] mà không cần phơi bày bất kỳ ruột nào. –

+0

@Jerry: đúng nhưng sau đó đối tượng proxy là rất nhiều công việc và bất kỳ lợi ích là nghi ngờ cho một đối tượng đa chiều (tất nhiên, cho một mảng * lởm chởm *, nó làm cho cảm giác hoàn hảo). –

5

Không có operator[][]. Đánh giá a[x][y] các cuộc gọi đầu tiên operator[] trên a, và sau đó operator[] một lần nữa về kết quả của điều đó.

Vì vậy, operator[] đối tượng của bạn phải trả về một đối tượng khác với riêng đối tượng operator[], sau đó sẽ truy cập giá trị được yêu cầu.

2

Theo như tôi biết không có điều nào như operator[][]. Những gì bạn có thể làm là bạn có thể quay trở lại từ phương thức operator[] của bạn đã bị quá tải operator[].

Thực tế bạn hiện đang làm việc này, vì bạn trả lại char*, có thể lập chỉ mục lại bằng cách sử dụng [] một lần nữa.

17

Không có toán tử [][]: đó là hai hoạt động [] liên tiếp. Bạn có thể:

  • Object::operator[] trả về một đối tượng của một lớp thứ hai đại diện cho một hàng, trong đó có operator[] phương pháp riêng của mình mà phải mất một số cột;
  • Viết phương thức get(int row, int column) và sử dụng phương thức đó thay vì quá tải toán tử. Tôi muốn đề nghị điều này trừ khi đối tượng của bạn hoàn toàn phải hành xử giống như một mảng.
+4

+1 Nếu lớp của bạn không có ý định hành xử như một hàm, hãy để toán tử() một mình. –

0

Không có nhà điều hành [][]. Điều thực sự xảy ra là số [] thứ hai hoạt động trên biến được trả về bởi [] đầu tiên.Bởi vì đã có chức năng đó, nó sẽ tạo ra sự mơ hồ ở đó để tồn tại một toán tử [][].


Ví dụ: giả sử bạn có một biến số x của một số loại T.

T x = new T(); 

Nếu chúng ta sử dụng toán tử [], giả sử một biến kiểu khác Q được trả về:

Q y = x[0]; 

Và sau đó sử dụng các nhà điều hành [] vào một biến kiểu Q có thể trả về một biến kiểu R:

R z = y[0]; 

Do đó x[][] trả về biến của t ype R.

Hãy nói rằng chúng tôi thực sự đã có thể quá tải [][] cho loại T như vậy mà nó trở lại một kiểu S:

S a = x[0][0]; 

Trình biên dịch sẽ không có cách nào để biết nếu nó nên sử dụng các nhà điều hành [][] trên x để trả về loại S biến hoặc sử dụng toán tử [] hai lần liên tiếp để trả về loại biến số R. Đây là sự mơ hồ tôi đã đề cập ở trên.


đặt cược tốt nhất của bạn nếu bạn đang bị mắc kẹt trên sử dụng dấu ngoặc vuông là phải có operator[] trả về một biến mà cũng có [] quá tải (hoặc có lẽ một biến cùng loại, với một bộ cờ), và có ban đầu đã trả về giao dịch biến đổi với số [] thứ hai.

Nhưng giải pháp tốt nhất ở đây (như đã đề cập trong another answer) là sử dụng toán tử khác như ().

+0

Sự mơ hồ có thể dễ dàng được giải quyết, ví dụ: bằng cách sử dụng phân tích tham lam. Ngoài ra, mã đầu tiên của bạn có lỗi vì 'new' trả về một con trỏ *. –