首页
社区
课程
招聘
一个C++类成员函数指针传递问题[急]
发表于: 2011-1-8 23:31 9049

一个C++类成员函数指针传递问题[急]

2011-1-8 23:31
9049
class test2
{
public:
void mTest(void *lp){;}
};

class test
{
public:
        void set(){T1.mTest(&test::test1);}
        void test1(){;}
private:
        test2 T1;
};

为什么不成功,搞了几个小时,还是没成功,纠结啊!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
static void test1(){;}可以

不知道你要做什么……
2011-1-8 23:35
0
雪    币: 91
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
你做的是传递函数指针,楼上的说的没错,声明为静态成员函数,是可以取得这个函数的地址
那么调用就能成功
你要用成员指针之类的才可以
解决方案1:
定义一个指向类成员函数的指针
typedef
void (test2::* Func)(void *lp);

然后就能可以使用它来得到类成员函数的地址了。不过这个方案很麻烦,要很小心才行

解决方案2:
以其传递成员函数的指针,为什么不直接传递一个类对象过去,这样的话
也省去一些麻烦。
2011-1-9 00:07
0
雪    币: 229
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上说的没错!
2011-1-9 00:19
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
5
_thiscall的问题 一般的C++类成员函数指针不能与普通的指针(或者函数指针)进行强转,但是类的静态成员函数可以因为他没有隐含的this参数
2011-1-9 00:38
0
雪    币: 9
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lyr
6
-------------------------------------------
2011-1-9 12:25
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不知道你想做什么,不过这样写没有问题(VS2005)
class test;
typedef void (__thiscall test::* CallBackFun)(void);
class test2
{
public:
        void mTest(CallBackFun lp){
                ((test*)(0)->*lp)();      //开玩笑,只是一个可能的调用方式
        }
};

class test
{
public:
        void set(){T1.mTest(&test::test1);}
        void test1(){;}
private:
        test2 T1;
};
2011-1-9 12:42
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
8
静态的话就不能用非静态成员函数了
2011-1-9 13:39
0
雪    币: 91
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
LZ没有好好看我的回复,哎
为什么不直接传一个对象的地址然后在回调函数中调用呢?如果没有这样的接口,那么说明设计这样的回调方式本身就有很大的缺陷。

类的静态成员函数能够和普通的指针一样,那是因为静态成员函数不属于对象,是属于这个类,所以才能够取得地址。每个成员函数的地址实际上是由每个实例化的对象中的指针来调用的,所以很多对象能够共享类中的成员函数,它们的数据是分别存放的,成员函数则是在调用相同的那一部分。你要想得到那个地址,就必须加上类作用限定符,来告诉编译器去哪里找到这个类的成员函数

还有我测试的结果是
typedef
void (test2::* Func)(void *lp);
前面加不加__thiscall都没有关系,实际上编译器似乎很智能,居然能够找到。
2011-1-9 14:41
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
10
所以才说不知道你想做什么?……
你想实现什么目的,或许有别的方法,像你这样直接传函数地址即使能实现,也可能会出问题,原因楼上几位都说了。
2011-1-9 20:55
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
据我观察,lz,是想做一个回调功能。

用类指针吧
2011-1-10 10:44
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
对于回调函数 一般会带由一个 COOKIE

这个是回调时返回的

一般有

typedef void (*CallBackFun)(unsigned int cookie /*... or other param */)

class A
{
   void Set(CallBackFun* fn,unsigned int cookie)
   {
      m_fn = fn;
      m_cookie = cookie;
   }

    void CallToFun()
   {
      m_fn(m_cookie); //<- do call back here .
   }

   CallBackFun m_fn;
   unsigned int m_cookie;
}
class B
{
   void SetCallback()
   {
      pA->Set(callbackFun,(unsigned int)this)//<- Set callback function and the callbackFun is static.
   }

   void  callbackFun()
   {
      //TODO: your task...
   }

   static void callbackFun(unsigned int cookie)
  {
     B* pThis = static_cast< B*> cookie;
     pThis->callbackFun();
  }

   A*pA ;
};
2011-1-10 15:13
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
没有看明白,你的意图......
2011-1-10 16:43
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
14
最后还是把类成员函数改成静态了..谢谢大家回复
2011-1-10 19:18
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
回调类的非静态成员函数,要手动传this指针才可以实现!C++类成员函数指针转普通的指针还是有办法实现的,欺骗下编译器而已,哈哈!
2011-1-10 21:03
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
C++类成员函数指针转普通的指针COPY一个:
template <class ToType,class FromType>
void GetMemberFuncAddr_VC(ToType& addr,FromType f)
{
        union
        {
                FromType _f;
                ToType   _t;
        }ut;

        ut._f = f;

        addr = ut._t;
}

void * P;
GetMemberFuncAddr_VC(p,&test::test1);

ECX = &T1 传完this指针才能调用P()
2011-1-10 21:33
0
游客
登录 | 注册 方可回帖
返回
//