标题:[原创] 类的成员函数也能做成回调函数?? 能!!
只看楼主
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
结帖率:100%
 问题点数:0 回复次数:5 
[原创] 类的成员函数也能做成回调函数?? 能!!
曾经做程序的时候想要把某个类的成员函数做成一个回调函数来用,但一直没有成功:

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
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
得分:0 
头都大了

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

时不再来!!!
2008-08-24 19:22
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
得分:0 
使用静态成员函数就能实现回调了,LZ有兴趣做一个Thread的封装就会明白了~

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2008-08-24 23:29
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
由于程序需要,不能做成静态函数。

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

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-08-25 14:06
suyilin68
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-8-4
得分:0 
佩服。。
2008-08-25 15:35
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
喜欢这种全OO的感觉

樱花大战,  有爱.
2008-08-28 17:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-229694-1-1.html




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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.708801 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved