2013-05-23 21 views
5

tôi có thể nạp chồng toán tử ngoặc bằng cách sử dụng chữ ký sau đây:Gọi ngoặc quá tải cho một con trỏ

char& operator()(const int r, const int c); 

Việc sử dụng dự định này sẽ là:

// myObj is an object of type MyClass 
myObj(2,3) = 'X' 
char Y = myObj(2,3); 

Những công trình như tôi mong đợi. Tuy nhiên, sử dụng toán tử dấu ngoặc đơn khi xử lý một con trỏ trở nên phức tạp. Tôi muốn thực hiện:

// pMyObj is a pointer to an object of type MyClass 
pMyObj->(2,3) = 'X'; 
char Y = pMyObj->(2,3); 

Tuy nhiên, cú pháp đó mang lại lỗi Error: expected a member name (ít nhất trong VisualStudio).

Sau đây không hoạt động nhưng có vẻ phức tạp với tôi với một sự suy xét và nhiều dấu ngoặc đơn hơn đối số.

char X = (*pMyObj)(2,3); 

Có cách nào để sử dụng toán tử -> để gọi quá tải () không?

+2

'pMyObj-> toán tử() (2,3)' – juanchopanza

+0

Bạn có chắc chắn không thể loại bỏ con trỏ không? Nếu không, bạn sẽ phải chọn ít hơn của hai tệ nạn. – chris

Trả lời

8

Có có được, nhưng bạn sẽ không thích nó:

pMyObj->operator()(2,3); 
+0

Thankyou! Tôi đã thử 'pMyObj-> operator (2,3)' nhưng điều đó không hiệu quả. Tôi đoán nó kinh tởm không có vấn đề gì bạn làm nhưng tôi nghĩ rằng tôi thích điều này! – chessofnerd

+2

@chessofred Vâng, thực sự có một cách khác: đừng quá tải toán tử() và thay vào đó sử dụng một hàm có tên có thể đọc được: ví dụ, 'pMyObj-> itemAt (2,3)' – Luis

+0

Wow đây là một câu hỏi rất hữu ích cho tôi đã phải đối mặt với một vấn đề với việc tạo ra một con trỏ đến hàm thành viên 'operator()' của 'std :: uniform_int_distribution'. Bây giờ tôi có thể sử dụng một con trỏ lớp và sử dụng hàm nhưng làm thế nào để tạo một con trỏ tới hàm thành viên một cách trực tiếp? Những điều sau đây dường như không hiệu quả đối với tôi: 'int (std :: uniform_int_distribution :: * myFunc) (std :: mt19937_64) = & std :: uniform_int_distribution :: operator' – Sudarsan

0

nếu bạn làm như sau

#define SUB operator() 

Sau đó, bạn có thể viết những điều như thế này ...

pMyObj->SUB(2,3) 

không thanh lịch như Fortran ;-) nhưng có lẽ không quá xấu để sử dụng thực tế