2010-08-13 45 views
6

Trong C bindings PortAudio của ++, có một constructior MemFunCallBackStream có thể được gọi là:Sử dụng chức năng thành viên lớp như Callback

portaudio::MemFunCallbackStream<MyClass> streamRecord(paramsRecord, 
                *AnInstanceOfMyClass, 
                &MyClass::MemberFunction); 

nơi tham số cuối cùng là chức năng gọi lại. Tuy nhiên không sử dụng toán tử & trên trình biên dịch tham số đó không thành công. Nhưng theo như tôi biết, thông số & có thể bỏ qua khi lấy địa chỉ các hàm để sử dụng trong các con trỏ hàm. Đây có phải là khác nhau từ chức năng gọi lại C và ptr. để func. cú pháp?

Trả lời

6

This FAQ dường như cho thấy rằng bạn có thể bỏ qua & (đối với các hàm thành viên tĩnh, ít nhất), nhưng sau đó tiếp tục đưa ra lý do khác nhau tại sao bạn không nên nhầm lẫn giữa bình thường chức năng con trỏ với C++ thành viên function- con trỏ.

EDIT: Tìm thấy thêm thông tin here, mà có liên quan đến chức năng thành viên không tĩnh:

Một số trình biên dịch (đáng chú ý nhất MSVC 6 và 7) sẽ cho phép bạn bỏ qua các & , thậm chí mặc dù nó là phi tiêu chuẩn và gây nhầm lẫn. Nhiều tiêu chuẩn tuân thủ trình biên dịch (ví dụ, GNU G ++ và MSVC 8 (aka VS 2005)) đòi hỏi nó, vì vậy bạn chắc chắn nên đặt nó trong. Để gọi con trỏ hàm thành viên, bạn cần để cung cấp một ví dụ của SomeClass, và bạn phải sử dụng toán tử đặc biệt ->*. Toán tử này có mức ưu tiên thấp, vì vậy bạn cần đặt nó trong các dấu ngoặc đơn . [Nhấn mạnh thêm]

2

Tiêu chuẩn C++, trong phần của nó đối với các nhà khai thác unary, khẳng định rằng một thành viên con trỏ-to-yêu cầu sử dụng rõ ràng của &.

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