您的位置:首页 > 移动开发 > 微信开发

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: