类成员函数不能作为普通函数地址传递给普通函数指针,几种解决方案

代码如下

#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;
}
时间: 2024-09-29 09:35:24

类成员函数不能作为普通函数地址传递给普通函数指针,几种解决方案的相关文章

类成员函数的指针与多态性

1 类成员函数的指针 2 类成员函数的指针数组 3 指向类成员函数的指针的指针 1 类成员函数的指针 auto func1 = &com::jia;//C++函数指针 int (com::*p)(int, int) = &com::jia;//C函数指针 1 #include <iostream> 2 3 class com 4 { 5 private: 6 int a; 7 int b; 8 public: 9 com(int x, int y) :a(x), b(y) 10

C++ 获取类成员函数地址方法 浅析

C语言中可以用函数地址直接调用函数: void print () { printf ("function print"); } typdef void (*fun)(); fun f = print; f(); C++中类非静态成员函数必须通过实例去调用,C++中类成员函数调用: class test { public: void print () { printf ("function print"); } }; 我们同样可以通过定义函数指针来调用如下: type

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

解决两类相互包含使用另一个类成员函数

// VistorMode.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <IOSTREAM> using namespace std; class B; class A{ public: /* void getBaction(B * p){ p->action(); //会出错,error:use of undefined type

C++:类成员函数的重载、覆盖和隐藏区别?

#include <iostream> class A { public: void func() { std::cout << "Hello" << std::endl; } void func(int k) { } }; class B : public A { public: using A::func; // 把这句注释掉试试,嘿嘿 void func(int i) { } }; int main() { B b; b.func();//编译

一个类成员函数的局部静态变量问题

之前工作中遇到一个问题,就像题目中描述的那样,看起来题目有些拗口复杂,这里解释下,当时遇到的需求需要这样处理:调用某个类对象的某个成员函数时,第一次有具体意义的,其他时候都是保持不变的.无意义的.这个需求可以看做是在调用某成员函数时,第一次进行初始化,其他时候不进行操作,即在首次调用时进行初始化,根据这点,很容易想到c/c++里面的static变量,它的作用是保持变量内容的持久,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.根据需求,使用static局部变量,写下

【非原创】C++类成员函数的重载、覆盖和隐藏

链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐藏区别描述正确的有? A.覆盖是指在同一个类中名字相同,参数不同 B.重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字 C.派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数 D.函数名字相同,参数相同,基类无virtual关键字的派生类的函数

【转】C++的const类成员函数

我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数).例如, const Screen blankScreen;  //Screen为class,

类成员函数可以为回调函数吗

关于类成员函数是否可以成为回调函数,我们首先需要明确几个定义,1. 什么是回调函数 2. 为什么要使用回调函数 3. 调用普通类成员函数和调用回调函数有什么区别 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int