2014-10-13 18 views
14

Tôi đang sử dụng C++ (không phải C++ 11). Tôi cần tạo một con trỏ tới một hàm bên trong một lớp. Tôi cố gắng thực hiện theo các bước sau:Tham chiếu đến chức năng thành viên không tĩnh phải được gọi là

void MyClass::buttonClickedEvent(int buttonId) { 
    // I need to have an access to all members of MyClass's class 
} 

void MyClass::setEvent() { 

    void (*func) (int); 
    func = buttonClickedEvent; // <-- Reference to non static member function must be called 

} 

setEvent(); 

Nhưng có lỗi: "Tham chiếu đến hàm thành viên không tĩnh phải được gọi". Tôi nên làm gì để tạo một con trỏ tới một thành viên của MyClass?

+2

Bạn không thể có con trỏ hàm được gán cho hàm thành viên. Bạn phải sử dụng một con trỏ đến thành viên hoặc một hàm miễn phí. – imreal

+0

Bạn có ý nghĩa gì với "con trỏ đến một thành viên"? Đối với "chức năng miễn phí", bạn có nghĩa là một chức năng bên ngoài một lớp học? Vâng, tôi biết rằng nó sẽ làm việc nếu tôi sẽ loại bỏ "MyClass ::" một phần từ định nghĩa "void MyClass :: buttonClickedEvent ..." nhưng tôi cần phải có quyền truy cập vào các thành viên của MyClass bên trong chức năng "buttonClickedEvent" .. – JavaRunner

Trả lời

16

Vấn đề là buttonClickedEvent là một hàm thành viên và bạn cần một con trỏ tới thành viên để gọi nó.

Hãy thử điều này:

void (MyClass::*func)(int); 
func = &MyClass::buttonClickedEvent; 

Và sau đó khi bạn gọi nó, bạn cần một đối tượng kiểu MyClass để làm như vậy, ví dụ this:

(this->*func)(<argument>); 

http://www.codeguru.com/cpp/cpp/article.php/c17401/C-Tutorial-PointertoMember-Function.htm

+1

Nhân tiện, khi tôi gọi cái này -> * func (23) - nó không hoạt động vì tôi cần sử dụng nó với dấu ngoặc đơn như sau: (this -> * func) (23) – JavaRunner

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