| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4123 人关注过本帖
标题:[原创] 类的成员函数也能做成回调函数?? 能!!
取消只看楼主 加入收藏
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
结帖率:100%
收藏
 问题点数:0 回复次数:1 
[原创] 类的成员函数也能做成回调函数?? 能!!
曾经做程序的时候想要把某个类的成员函数做成一个回调函数来用,但一直没有成功:

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;
}
搜索更多相关主题的帖子: callback class 回调 回调函数 
2008-08-24 18:59
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
由于程序需要,不能做成静态函数。

2楼的,就这一点点代码,你还看的头大?
哎,可惜了我的游戏哦,要是开源一下,真不知道有多少人看呢

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-25 14:06
快速回复:[原创] 类的成员函数也能做成回调函数?? 能!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013794 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved