| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 321 人关注过本帖
标题:[原创] 类的成员函数也能做成回调函数?? 能!!
收藏  订阅  推荐  打印 
flyue
Rank: 6Rank: 6
等级:金牌会员
威望:6
帖子:1721
积分:17882
注册:2006-6-20
[原创] 类的成员函数也能做成回调函数?? 能!!

曾经做程序的时候想要把某个类的成员函数做成一个回调函数来用,但一直没有成功:
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-8-24 18:59
无缘今生
Rank: 3Rank: 3
等级:中级会员
威望:2
帖子:465
积分:4860
注册:2007-6-25

头都大了

虽然看得不是太懂,但还是佩服楼主的探索精神!

时不再来!!!
2008-8-24 19:22
yuki
Rank: 4
等级:高级会员
威望:5
帖子:507
积分:6330
注册:2005-2-4

使用静态成员函数就能实现回调了,LZ有兴趣做一个Thread的封装就会明白了~

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2008-8-24 23:29
flyue
Rank: 6Rank: 6
等级:金牌会员
威望:6
帖子:1721
积分:17882
注册:2006-6-20

由于程序需要,不能做成静态函数。

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

大家一起来编程吧!
2008-8-25 14:06
suyilin68
Rank: 1
等级:新手上路
帖子:1
积分:110
注册:2008-8-4

佩服。。
2008-8-25 15:35
中学者
Rank: 12Rank: 12Rank: 12
等级:版主
威望:11
帖子:3376
积分:34562
注册:2007-9-14

喜欢这种全OO的感觉

汇编.....
2008-8-28 17:13
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.054832 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved