2014-05-15 20 views
6

Tôi có một con trỏ tới một hàm thành viên được định nghĩa trong một lớp học, ví dụ:Calling con trỏ-to-hàm thành viên C++

class Example { 
    void (Example::*foo)(); 

    void foo2(); 
}; 

Trong mã chính của tôi, tôi sau đó thiết lập foo như:

Example *a; 
a->foo = &Example::foo2; 

Tuy nhiên, khi tôi cố gắng gọi foo:

a->foo(); 

tôi nhận được lỗi thời gian biên dịch như sau: "lỗi: biểu trước ngoặc của cuộc gọi rõ ràng phải có (loại hàm trỏ tới) ". Tôi giả sử tôi nhận được cú pháp sai ở đâu đó, ai đó có thể chỉ ra cho tôi?

+4

'làm việc (a -> * (a-> foo))() '- Tôi nghĩ? –

+0

Thật không may, điều này không hoạt động. a -> * foo() trả về "error: foo is undefined" và a -> * (a-> foo)() đưa ra thông báo lỗi gốc. – wolfPack88

+3

bạn cần parens xung quanh 'a -> * (a-> foo)' vì cách toán tử ưu tiên hoạt động –

Trả lời

13

gọi nó là bạn sẽ làm gì: (a->*(a->foo))()

(a->*X)(...) - dereferences một con trỏ hàm thành viên - các dấu ngoặc xung quanh a->*X là quan trọng đối với ưu tiên.

X = a->foo - trong ví dụ của bạn.

Xem ideone here ví dụ

+1

Xem Câu hỏi thường gặp về C++ để biết ví dụ và thảo luận làm việc: http://www.parashift.com/ C++ - faq/pointers-to-members.html –

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