类的成员函数也能做回调函数

来源:互联网 发布:gdp季度数据 编辑:程序博客网 时间:2024/04/29 22:43
 
class CCallBack
{
public:
    // 测试的被回调的函数
    void TestFunc(int a)
    {
        printf("%d\n", a);
    }
};

void main()
{
    CCallBack cb;
    void* f = (void*)(cb.TestFunc);
}



Compiling...
test.cpp
test.cpp(85) : error C2440: 'type cast' : cannot convert from 'void (__thiscall CCallBack::*)(int)' to 'void *'
        There is no context in which this conversion is possible
执行 cl.exe 时出错.

(曾经问过StarWing,他说这是不可能实现的

后来找了好多资料,终于被我发现了,原来类函数的回调并非不可实现。居然还有这招!真是绝了:


#include <stdio.h>

//////////////////////////////////////////////////////////////////////////
// 被回调的类
class CCallBack
{
public:
    // 测试的被回调的函数
    void TestFunc(int a)
    {
        printf("%d\n", a);
    }
};

// 声明被回调函数类型
typedef void(CCallBack::*TESTFUNC)(int);

//////////////////////////////////////////////////////////////////////////
// 调用回调的类
class CMyCall
{
    CCallBack*    m_pCallBack;    // 首先要有回调类对象指针
    TESTFUNC    m_CallFunc;        // 还要回调函数的指针
    // 二者缺一不可

public:
    CMyCall()
    {
        // 初始化一下,不要也行
        m_pCallBack = 0;
        m_CallFunc = 0;
    }

    // 设置回调函数的指针
    void SetFuncPtr(TESTFUNC f)
    {
        m_CallFunc = f;
    }

    // 调用它!
    void Call()
    {
        // 以下这种调用的格式是很重要的,是本代码的核心部分
        // 大家得记清楚了
        (m_pCallBack->*m_CallFunc)(18);
    }
};

//////////////////////////////////////////////////////////////////////////
// 用于测试的类
class RUN
{
public:
    RUN()
    {
        CMyCall my;
        my.SetFuncPtr(CCallBack::TestFunc);        // 看,就像这样把TestFunc的指针传给它
        my.Call();                                // Call It!
    }
};

void main()
{
    RUN run;
}