1. 程式人生 > >類成員函數不能作為普通函數地址傳遞給普通函數指針,幾種解決方案

類成員函數不能作為普通函數地址傳遞給普通函數指針,幾種解決方案

設置 函數指針 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:
    void
show() { 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;
}

類成員函數不能作為普通函數地址傳遞給普通函數指針,幾種解決方案