c++ 回调类成员函数实现

实现类成员函数的回调,并非静态函数;区分之

#ifndef __CALLBACK_PROXY_H_
#define __CALLBACK_PROXY_H_                                                           

template <typename Tobject, typename Tparam>
class CCallbackProxy{
    typedef void (Tobject::*CbFun)(Tparam*);                                          

public:
    void Set(Tobject *pInstance, CbFun pFun);
    bool Exec(Tparam* pParam);
private:
    CbFun pCbFun;           //回调函数指针
    Tobject* m_pInstance;   //调用对象
};                                                                                    

template <typename Tobject, typename Tparam>
void CCallbackProxy<Tobject, Tparam>::Set(Tobject* pInstance, CbFun pFun)
{
    m_pInstance = pInstance;
    pCbFun      = pFun;
}                                                                                     

template <typename Tobject, typename Tparam>
bool CCallbackProxy<Tobject, Tparam>::Exec(Tparam* pParam)
{
    (m_pInstance->*pCbFun)(pParam);
    return true;
}                                                                                     

#endif 

命名为:CallbackProxy.h

 1 #include <iostream>
 2 #include "CallbackProxy.h"
 3
 4 class CTest
 5 {
 6 public:
 7     CTest(int nNum):m_nSum(nNum){
 8     }
 9     void CbPrintSum(int *pnAddNum){
10         std::cout << "The sum is: " <<m_nSum +*pnAddNum << std::endl;
11     }
12 private:
13     int m_nSum;
14 };
15
16
17 int main()
18 {
19     CCallbackProxy<CTest, int> CbProxy;
20     CTest test(10);
21     CbProxy.Set(&test, &CTest::CbPrintSum);
22
23     int num = 100;
24     CbProxy.Exec(&num);
25     return 0;
26 }

命名为:test.cpp

g++ test.cpp -g -Wall && ./a.out

时间: 2024-10-12 07:52:31

c++ 回调类成员函数实现的相关文章

成员函数指针,动态绑定(vc平台)

上一篇介绍了gcc对成员函数指针做了thunk的处理,本篇介绍vc对成员函数指针如何处理,还有动态绑定相关的处理. 同样用回上一篇的例子: struct point {float x,y;}; struct obj { virtual ~obj {} void foo(int) {} void foo(point) {} virtual void vfoo() {} }; struct objobj : public obj { virtual ~objobj {} virtual void v

理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)

我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以拿来学习应该是很方便的.但是因为ATL的代码充满了模板和宏,内部还夹杂着汇编,所以如果没有比较丰富的C++模板和系统底层的知识,一般人会看得一头雾水. 下面我们主要分析一下ATL中的一些汇编代码. ATL中出现汇编代码主要是2处,一处是通过Thunk技术来调用类成员函数处理消息:还有一处是通过打开_

实现类成员函数回调

一.采用tri::function/bind方法实现类成员函数内部调用 首先声明函数类型 1 std::tr1::function<double(double)> func; 在需要调用函数的地方绑定函数 1 switch (flgFun) { 2 case flgSine: 3 func = std::tr1::bind(&CAnalog::Sin, this, std::tr1::placeholders::_1); 4 break; 5 case flgSquare: 6 fun

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&

并发编程: c++11 thread(Func, Args...)利用类成员函数创建线程

c++11是VS2012后支持的新标准,为并发编程提供了方便的std::thread. 使用示例: #include <thread> void thread_func(int arg1, int arg2, float* arg3){ arg3 = (arg1*1.0)/(arg1 + arg2); cout << "arg1 / (arg1 + arg2) = " << arg3 << endl; return; } void mai

一步一步学习C++(类)之成员函数的特性

在类体中说明的函数作为类的成员,称为成员函数.一般的成员函数,它是根据某种类的功能的需要来定义的.除此之外,又讨论了一些特殊的成员函数:构造函数.析构函数.拷贝初始化构造函数等.本节讨论除成员函数定义与说明之外的其它一些特殊属性. 一.内联函数和外联函数 类的成员函数可分为内联函数与外联函数.内联函数是指定义在类体内的成员函数,即该函数的定义放在类的体内.而对成员函数的说明放在体内,其函数的定义放在体外称之为外联函数.如果使外联函数转变为内联函数,只须在函数头部左端加上关键字inline即可.

C++学习笔记(2)---2.5 C++函数编译原理和成员函数的实现

转载自:http://c.biancheng.NET/cpp/biancheng/view/2996.html点击打开链接 从上节的例子可以看出,对象的内存模型中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 obj 的类型为 Demo,也不知道它还有一个成员函数 display().那么,究竟是如何通过对象调用成员函数的呢? C++函数的编译 C++和C语言的编译方式不同.C语言中的函数在编译时名字不变,或者只是简单的加一个下划线_(不同的编译器有不同的实现),例如,func()

类的成员函数的指针

前面一篇文章<函数的指针 >介绍了全局函数的指针,现在我们再来介绍一下成员函数的指针. 成员函数指针的定义: 一般形式 Return_Type (Class_Name::* pointer_name) (Argument_List); 用typedef简化的形式 Typedef Return_Type (Class_Name::* FuncPtr_Type) (Argument_List); FuncPtr_Type pFunc = NULL; //pFunc为成员函数指针的指针变量 成员函数

Time类的定义(成员函数)

2-2 Time类的定义 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握类与对象的定义: 设计一个时间类Time,私有数据成员有hour(时).minute(分).second(秒): 公有成员函数有:setHour(int)设置数据成员hour的值,非法的输入默认为12:setMinue(int)设置数据成员minute的值,非法输入默认为0:setSecond(int)设置数据成员second的值,非法输入默认为0:setT