2016-09-05 20 views
5
khác

tôi muốn làm một lớp lưu trữ con trỏ hàm, nhưng khi tôi muốn lưu trữ chúng trong các biến thành viên tôi nhận được lỗi này:C++ Gán con trỏ hàm để

invalid use of member function (did you forget the '()' ?)

¿đâu là lỗi của tôi?

class Button { 
public: 
    Button(PS3USB * ps3, ButtonEnum button, void (*onPress)(void) = nullptr, 
      void (*onRelease)(void) = nullptr) { 
     PS3 = ps3; 
     status = false; 
     ERROR ---> onPressFunction = onPress; <--- ERROR 
     ERROR ---> onReleaseFunction = onRelease; <--- ERROR 
     id = button; 
    } 
    void check() { 
     if (PS3->getButtonClick(id) && !status) { 
      if (onPressFunction != nullptr) { 
       onPressFunction(); 
      } 
      status = !status; 
     } else if (!PS3->getButtonClick(id) && status) { 
      if (onReleaseFunction != nullptr) { 
       onReleaseFunction(); 
      } 
      status = !status; 
     } 
    } 
private: 
    bool status; 
    PS3USB * PS3; 
    ButtonEnum id; 
    void * onPressFunction(void); 
    void * onReleaseFunction(void); 

}; 

Cảm ơn

+0

Bạn có thể thêm vào những gì dòng lỗi xảy ra? Ngoài ra nếu bạn sử dụng C++ 11, bạn nên có một cái nhìn tại 'std :: function' thay vì con trỏ funtion thô. – Hayt

+0

Bạn thực sự nên sử dụng một 'typedef' cho các con trỏ hàm của bạn. Điều đó cũng đã giải quyết vấn đề này. Hoặc thậm chí sử dụng 'std :: function' nếu bạn có thể. – nvoigt

Trả lời

10
void * onPressFunction(void); 
void * onReleaseFunction(void); 

Đây là tuyên bố của một hàm thành viên, không phải là một con trỏ hàm. Để khai báo con trỏ hoạt động thay vì sử dụng:

void (*onPressFunction)(void); 
void (*onReleaseFunction)(void); 
+0

Vấn đề là dấu ngoặc đơn, Cảm ơn Serhio. –

2
void * onPressFunction(void); 
void * onReleaseFunction(void); 

Những trên không khai báo một con trỏ hàm, nhưng họ tạo một hàm thành viên từng trả về một con trỏ đến một khoảng trống, tôi nghĩ bạn có nghĩa là điều này:

void (* onPressFunction)(void); 
void (* onReleaseFunction)(void); 

Ngoài ra, đối con trỏ hàm, tôi sẽ khuyên bạn sử dụng typedefs, hoặc std::function

typedef Ví dụ

typedef void(*onReleaseFunction)(void); 

Và nó có thể được sử dụng như thế này:

onReleaseFunction func = &functionname; 
+1

Thậm chí tốt hơn sẽ là cú pháp mới cho một typedef: 'using onPressFunction = void (*)();' – Oktalist

+0

Thats một điểm tốt @Oktalist –

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