怎么实现类的成员函数作为回调函数

 更新时间:2020年4月25日 17:44  点击:2088

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。  

1). 不使用成员函数,为了访问类的成员变量,可以使用友元操作符(friend),在C++中将该函数说明为类的友元即可。   

2). 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果做不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。 这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。

首先明白什么是回调函数:比如说被调函数void callbackf(int n){}要想作为回调函数的话,callbackf必须作为主调函数的形参出现,如void f(void (*p(int)),int n)形式才行!

例子:

例1:

复制代码 代码如下:

#include<iostream>
using namespace std;
class A
{
public:

 friend void callback()  //友元函数作为回调函数 friend方式实现
 {
  cout<<"回调函数开始执行了!"<<endl;
 }
};
void f(void (*p)())
 {
  p();

 }
int main()
{
 void (*p)();
 p=callback;
 f(p);
 return 0;
}


例2:
复制代码 代码如下:

#include<iostream>
using namespace std;
class A
{
public:

 static void callback()  //类的成员函数作为回调函数 static方式实现
 {
  cout<<"回调函数开始执行了!"<<endl;
 }
};
void f(void (*p)())
 {
  p();

 }
int main()
{
 void (*p)();
 p=A::callback;
 f(p);
 return 0;
}


还可以把f()函数设为类的成员函数:
复制代码 代码如下:

#include<iostream>
using namespace std;
class A
{
public:

 static void callback()  //类的成员函数作为回调函数 static方式实现
 {
  cout<<"回调函数开始执行了!"<<endl;
 }
 void f(void (*p)())
 {
  p();

 }
};

int main()
{
 A a;
 void (*p)();
 p=A::callback;
 a.f(p);
 return 0;
}

[!--infotagslink--]

相关文章

  • 在vue中使用回调函数,this调用无效的解决

    这篇文章主要介绍了在vue中使用回调函数,this调用无效的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • C++静态成员函数不能调用非静态成员变量(详解)

    下面小编就为大家带来一篇C++静态成员函数不能调用非静态成员变量(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • C#中异步回调函数用法实例

    这篇文章主要介绍了C#中异步回调函数用法,实例分析了异步回调函数的定义及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 详解C++编程中类的成员变量和成员函数的相关知识

    这篇文章主要介绍了C++编程中类的成员变量和成员函数的相关知识,是C++入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • C++中的四个默认成员函数与运算符重载详解

    这篇文章主要给大家介绍了关于C++中四个默认成员函数与运算符重载的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。...2020-04-25
  • C/C++回调函数介绍

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数...2020-04-25
  • C++类中六个默认的成员函数详解

    这篇文章主要给大家介绍了关于C++类中六个默认的成员函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-08
  • 怎么实现类的成员函数作为回调函数

    不使用成员函数,为了访问类的成员变量,可以使用友元操作符(friend),在C++中将该函数说明为类的友元即可...2020-04-25
  • C++运算符重载 成员函数与友元函数详解

    以下是对C++运算符重载 成员函数与友元函数进行了介绍,需要的朋友可以过来参考下...2020-04-25
  • 深入VC回调函数的使用详解

    本篇文章是对VC回调函数的使用进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • 关于Javascript回调函数的一个妙用

    相信在刚开始学习JavaScript的时候,很多人感到最困惑的就是回调函数了。本文通过一个小小的例子来分析回调函数的用法。对大家学习Javascript回调函数很有帮助,有需要的可以来参考学习。...2016-09-01
  • C++类的空指针调用成员函数的代码

    这篇文章主要介绍了C++类的空指针调用成员函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-31
  • js自定义回调函数

    这篇文章主要介绍了javascript自定义回调函数,感兴趣的小伙伴们可以参考一下...2015-12-14
  • c++中string类成员函数c_str()的用法

    c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式...2020-04-25
  • 对js中回调函数的一些看法

    下面小编就为大家带来一篇对js中回调函数的一些看法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
  • 正则替换回调函数 preg_replace_callback()—Unicode 转中文方法

    本次一聚教程网为大家带来了正则替换回调函数preg_replace_callback()—Unicode转中文方法,想要学习这个技能的同学快来看看吧。 在之前编写PHP工具类时,常用一个正...2017-01-22
  • JS动态插入并立即执行回调函数的方法

    这篇文章主要介绍了JS动态插入并立即执行回调函数的方法,实例分析了动态插入js文件及执行回调函数的相关技巧,需要的朋友可以参考下...2016-04-23
  • 谈谈JavaScript自定义回调函数

    废话不多说了,直接给大家贴代码了。背景分析首先看一段js的代码,主要实现添加的时候首先通过异步请求判断是否存在,如果不存在的话,在进行添加操作:function add(url,data) { var isExited = isExited(data); if(!isExite...2015-10-21
  • C++ 中回调函数详解及简单实例

    这篇文章主要介绍了C++ 中回调函数详解及简单实例的相关资料,需要的朋友可以参考下...2020-04-25
  • 理解与使用JavaScript中的回调函数

    这篇文章主要介绍了JavaScript中的回调函数,想详细了解回调函数的同学,一定要看一下...2021-04-28