類成員函數不能作為普通函數地址傳遞給普通函數指針,幾種解決方案
阿新 • • 發佈:2017-07-22
設置 函數指針 glut idle llb .sh c函數 open 百度
代碼如下
#include <iostream> using namespace std; class A { public: int i; public: void show() { cout << "哈哈" << endl; } }; void print(void(*p)()) { (*p)(); } int main() { A a; print(a.show); return 0; }
其中,print函數的形參為一個函數指針。在編程的時候,我需要將類A的對象a的成員函數show傳遞進去。如上編程,會出現下述錯誤:
Error C3867 ‘A::show‘: non-standard syntax; use ‘&‘ to create a pointer to member
好,我加一個&來創建函數指針,即把main函數中的print(a.show)改為print(&a.show),編譯,再次出現錯誤:
Error C2276 ‘&‘: illegal operation on bound member function expression
百度之,網上有一堆解決方案,有把show設置成靜態函數的,友元函數的,這些都對編程有一定限制。我看到的一個比較好的答案是
#include <iostream> using namespace std; class A { public: int i; public: voidshow() { cout << "哈哈" << endl; } }; void print(void(A::*p)(),A& a) { (a.*p)(); } int main() { A a; print(&A::show,a); return 0; }
這個解決方案,可以運行。但是最大的缺陷是,把print函數都改了。如果我需要把show函數傳遞給OpenGL裏面的glutIdleFunc(void (*callback)())這樣的函數呢?那就沒法修改glutIdleFunc函數了。至此,還一個解決方案是,設置一個中間函數temp,間接調用回調函數。不過這樣子,a必須為全局變量了
#include <iostream> using namespace std; class A { public: int i; public: void show() { cout << "哈哈" << endl; } }; A a; void print(void(*p)()) { (*p)(); } void temp() { a.show(); } int main() { print(temp); return 0; }
類成員函數不能作為普通函數地址傳遞給普通函數指針,幾種解決方案