CALLBACK 回调函数 一个小程序帮助理解回调函数
2011-03-09 16:59
183 查看
//个人愚见 错漏难免 不保无误
#include <windows.h>
#include <iostream>
using namespace std;
class CAClass
{
public:
CAClass();
typedef void(CALLBACK *fnShowCallBack)();//函数指针
static void CALLBACK show(); //回调函数
void memShow(int); //成员函数
public:
fnShowCallBack m_fnCallback; //函数指针 用于实现回调
int m_imem;
private:
static CAClass* pToThis; //静态全局指针
void initpToThis(); //使全局指针pToThis指向this
void callbackShow(); //回调专用函数
};
//静态全局指针初始化为NULL
CAClass* CAClass::pToThis = NULL;
CAClass::CAClass():
m_imem(100)
, m_fnCallback(NULL)
{
//使全局指针pToThis指向this
CAClass::initpToThis();
}
//使全局指针pToThis指向this
void CAClass::initpToThis()
{
pToThis = this;
}
//回调函数
void CAClass::show()
{
//pToThis->memShow(456); //用全局指针实现调用
return pToThis->callbackShow();//返回一成员函数(回调专用)以避免使用pToThis
}
//回调专用
void CAClass::callbackShow()
{
cout<<"回调函数的操作转到这个函数中 免去全局指针的使用"<<endl;
pToThis->memShow(123); //可以用全局指针
memShow(123); //也可以免去全局指针
}
//成员函数
void CAClass::memShow(int value)
{
cout<<"输出成员变量:"<<m_imem<<endl;
cout<<"成员函数调用:"<<value<<endl;
}
//第二个类
class class2
{
public:
class2();
static void CALLBACK show();
void show(int);
int m_ii;
private:
static class2* pToThis;
void initpToThis();
};
class2* class2::pToThis = NULL;
void class2::initpToThis()
{
pToThis = this;
}
class2::class2()
{
class2::initpToThis();
}
void class2::show()
{ //回调函数
cout<<"第二个类中的回调实现:"<<pToThis->m_ii<<endl;
pToThis->show(88888);
}
void class2::show(int value)
{
cout<<"第二个类中的成员函数:"<<value<<endl;
}
//定义一个单独的回调函数
void CALLBACK showwww()
{
cout<<"这不是一个类的静态成员函数"<<endl;
}
int main()
{
//第一种回调方法(比较怪异,暗藏危机。只为说明回调的用法)
//如果没有实例化对象这种方法会失败(不实例化对象可以寻址“成员函数”却无法寻址“成员变量”)
//具体原因可以参考《深度探索c++对象模型》一书,我不能提供比较理想的解释
CAClass ob1;//没有这一句这种方法会失败,但是如果去掉成员变量m_imem就会成功
ob1.m_imem = 111111;
cout<<"第一种回调方法:"<<endl;
CAClass::fnShowCallBack pFn = NULL;//定义函数指针
pFn = CAClass::show;
if (pFn!=NULL)
{
pFn();//此处实现回调
}
//第二种回调方法
cout<<"/n"<<"第二种回调方法:"<<endl;
CAClass ob;
ob.memShow(123);//对象调用
ob.m_fnCallback = CAClass::show;
if (ob.m_fnCallback!=NULL)
{
ob.m_fnCallback();//此处实现回调
}
cout<<endl;
//注意此处pFn()与第一次调用pFn()的结果的区别
//具体原因可以参考《深度探索c++对象模型》一书,我不能提供比较理想的解释
cout<<"第一种回调方法:"<<endl;
pFn();
cout<<endl;
//其他方法实现回调.............
cout<<"第三种回调方法:"<<endl;
class2 ob3;
ob3.m_ii = 99999;
ob.m_fnCallback = class2::show;//注意必须先实例化class2 的对象
ob.m_fnCallback();
cout<<endl;
cout<<"第四种回调方法:"<<endl;
ob.m_fnCallback = showwww;
ob.m_fnCallback();
cout<<"/n"<<"输入任意字符 按回车结束:";
INT i;
cin>>i;
cout<<endl;
return 1;
}
#include <windows.h>
#include <iostream>
using namespace std;
class CAClass
{
public:
CAClass();
typedef void(CALLBACK *fnShowCallBack)();//函数指针
static void CALLBACK show(); //回调函数
void memShow(int); //成员函数
public:
fnShowCallBack m_fnCallback; //函数指针 用于实现回调
int m_imem;
private:
static CAClass* pToThis; //静态全局指针
void initpToThis(); //使全局指针pToThis指向this
void callbackShow(); //回调专用函数
};
//静态全局指针初始化为NULL
CAClass* CAClass::pToThis = NULL;
CAClass::CAClass():
m_imem(100)
, m_fnCallback(NULL)
{
//使全局指针pToThis指向this
CAClass::initpToThis();
}
//使全局指针pToThis指向this
void CAClass::initpToThis()
{
pToThis = this;
}
//回调函数
void CAClass::show()
{
//pToThis->memShow(456); //用全局指针实现调用
return pToThis->callbackShow();//返回一成员函数(回调专用)以避免使用pToThis
}
//回调专用
void CAClass::callbackShow()
{
cout<<"回调函数的操作转到这个函数中 免去全局指针的使用"<<endl;
pToThis->memShow(123); //可以用全局指针
memShow(123); //也可以免去全局指针
}
//成员函数
void CAClass::memShow(int value)
{
cout<<"输出成员变量:"<<m_imem<<endl;
cout<<"成员函数调用:"<<value<<endl;
}
//第二个类
class class2
{
public:
class2();
static void CALLBACK show();
void show(int);
int m_ii;
private:
static class2* pToThis;
void initpToThis();
};
class2* class2::pToThis = NULL;
void class2::initpToThis()
{
pToThis = this;
}
class2::class2()
{
class2::initpToThis();
}
void class2::show()
{ //回调函数
cout<<"第二个类中的回调实现:"<<pToThis->m_ii<<endl;
pToThis->show(88888);
}
void class2::show(int value)
{
cout<<"第二个类中的成员函数:"<<value<<endl;
}
//定义一个单独的回调函数
void CALLBACK showwww()
{
cout<<"这不是一个类的静态成员函数"<<endl;
}
int main()
{
//第一种回调方法(比较怪异,暗藏危机。只为说明回调的用法)
//如果没有实例化对象这种方法会失败(不实例化对象可以寻址“成员函数”却无法寻址“成员变量”)
//具体原因可以参考《深度探索c++对象模型》一书,我不能提供比较理想的解释
CAClass ob1;//没有这一句这种方法会失败,但是如果去掉成员变量m_imem就会成功
ob1.m_imem = 111111;
cout<<"第一种回调方法:"<<endl;
CAClass::fnShowCallBack pFn = NULL;//定义函数指针
pFn = CAClass::show;
if (pFn!=NULL)
{
pFn();//此处实现回调
}
//第二种回调方法
cout<<"/n"<<"第二种回调方法:"<<endl;
CAClass ob;
ob.memShow(123);//对象调用
ob.m_fnCallback = CAClass::show;
if (ob.m_fnCallback!=NULL)
{
ob.m_fnCallback();//此处实现回调
}
cout<<endl;
//注意此处pFn()与第一次调用pFn()的结果的区别
//具体原因可以参考《深度探索c++对象模型》一书,我不能提供比较理想的解释
cout<<"第一种回调方法:"<<endl;
pFn();
cout<<endl;
//其他方法实现回调.............
cout<<"第三种回调方法:"<<endl;
class2 ob3;
ob3.m_ii = 99999;
ob.m_fnCallback = class2::show;//注意必须先实例化class2 的对象
ob.m_fnCallback();
cout<<endl;
cout<<"第四种回调方法:"<<endl;
ob.m_fnCallback = showwww;
ob.m_fnCallback();
cout<<"/n"<<"输入任意字符 按回车结束:";
INT i;
cin>>i;
cout<<endl;
return 1;
}
相关文章推荐
- 一个Java小程序,帮助理解Java继承中的初始化过程
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- Linux内核分析课程--通过反汇编一个简单的c程序,分析汇编代码并理解计算机如何工作的
- callback回调函数的理解
- 通过一个登陆程序来理解几个jsp内置对象的使用
- Android Context理解/在一个应用中程序中有多少个context实例?
- 我是一个线程(对理解多线程很有帮助)
- smarty学习基础篇----仿照samrty模版写一个自己的简单smarty模版 帮助自己理解smarty
- 什么是回调函数Callback----自己的一点理解
- 理解OO 思想 架构好一个程序之基石!~
- 如何定义一个回调函数,理解回调函数调用机制
- 我对调试程序的一个理解
- 理解javascript中的回调函数(callback)
- [Java实现]通过一个Java小程序(吃苹果)深入理解面向对象思想
- DynamicResource帮助定义一个程序中的通用资源
- 私有继承的一个例子,帮助加强理解
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 【理解】一个利用递归打印对象路径下所有文件的小程序