游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5938|回复: 11

怎样才能将类的this指针传入类中的回调函数?

[复制链接]

9

主题

39

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2010-3-15 16:33:00 | 显示全部楼层 |阅读模式
我做了一个类,包含一个回调函数
怎样才能将类的this指针传入这个回调函数?

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2010-3-15 16:53:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

你该不会是想做类函数指针吧?

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2010-3-16 09:50:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

this指针相当于class的成员变量的首地址,所以每个instance的this是不同的
这个this会自动被c++ compiler添加到每个member function的第一个parameter中
所以,当你的call back不是member function,就必须用一些技巧
例如,声明一个static class* s_this_ptr;然后在ctor中赋值,最后在call back中使用
但带来的问题是只对一个实例起作用

或者

void callback(void* this_ptr, ...)
{
   class* p = (class *)this_ptr;
   ...
}

class x;
callback(&x, ...);

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2010-3-17 12:39:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

1 用C++ 2010 中的lambda表达式
2 用手工方法:

template <class Tdest, class Tsrc> union _UnionCast
{
        Tdest dest;
        Tsrc src;
};

template <class Tdest, class Tsrc> __forceinline Tdest union_cast(Tsrc x)
{
        _UnionCast<Tdest,Tsrc> tmp;
        tmp.src=x;
        return tmp.dest;
}

class __obj{};

#define THISCALLBACK(pthis,pfunc,rettype,params,args)                 ( reinterpret_cast<__obj *>(pthis) ->* ::inst::union_cast<rettype (__obj::*)params>(pfunc) ) args

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2010-3-17 18:58:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

用boost::function

22

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-3-22 13:32:00 | 显示全部楼层

Re: 怎样才能将类的this指针传入类中的回调函数?

以void类型传入

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2010-3-22 22:58:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

还要注意引用计数等问题。还有类型转换问题。很麻烦的。

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2010-3-23 15:14:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

typedef int (*callback)(void*);
class A
{
public:
        int val;
        void print(int v)
        {
                char buf[16];
                sprintf(buf, "hello %d\n", v);
                printf(buf);
        }
        static int func(void* p)
        {
                A* pp=(A*)p;
                pp->print(pp->val);
                return 0;
        }
};

int _tmain(int argc, _TCHAR* argv[])
{
        A a;
        a.val=5;
        A::func(&a);
        getchar();
        return 0;
}

7

主题

170

帖子

190

积分

注册会员

Rank: 2

积分
190
QQ
发表于 2010-4-2 23:27:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

Use member functions for C-style callbacks and threads - a general solution
http://www.codeproject.com/KB/winsdk/callback_adapter.aspx

见该贴评论:There Is An Even Easier Way
http://www.codeproject.com/Messages/2558726/There-Is-An-Even-Easier-Way.aspx

36

主题

512

帖子

512

积分

高级会员

Rank: 4

积分
512
发表于 2010-4-3 16:26:00 | 显示全部楼层

Re:怎样才能将类的this指针传入类中的回调函数?

类的this指针只能指向对象实体,能这样使用吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-10 10:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表