能力值:
( LV12,RANK:270 )
2 楼
static void test1(){;}可以
不知道你要做什么……
能力值:
( LV3,RANK:30 )
3 楼
你做的是传递函数指针,楼上的说的没错,声明为静态成员函数,是可以取得这个函数的地址
那么调用就能成功
你要用成员指针之类的才可以
解决方案1:
定义一个指向类成员函数的指针
typedef
void (test2::* Func)(void *lp);
然后就能可以使用它来得到类成员函数的地址了。不过这个方案很麻烦,要很小心才行
解决方案2:
以其传递成员函数的指针,为什么不直接传递一个类对象过去,这样的话
也省去一些麻烦。
能力值:
( LV2,RANK:10 )
4 楼
楼上说的没错!
能力值:
( LV12,RANK:320 )
5 楼
_thiscall的问题 一般的C++类成员函数指针不能与普通的指针(或者函数指针)进行强转,但是类的静态成员函数可以因为他没有隐含的this参数
能力值:
( LV2,RANK:10 )
6 楼
-------------------------------------------
能力值:
( 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;
};
能力值:
( LV12,RANK:360 )
8 楼
静态的话就不能用非静态成员函数了
能力值:
( LV3,RANK:30 )
9 楼
LZ没有好好看我的回复,哎
为什么不直接传一个对象的地址然后在回调函数中调用呢?如果没有这样的接口,那么说明设计这样的回调方式本身就有很大的缺陷。
类的静态成员函数能够和普通的指针一样,那是因为静态成员函数不属于对象,是属于这个类,所以才能够取得地址。每个成员函数的地址实际上是由每个实例化的对象中的指针来调用的,所以很多对象能够共享类中的成员函数,它们的数据是分别存放的,成员函数则是在调用相同的那一部分。你要想得到那个地址,就必须加上类作用限定符,来告诉编译器去哪里找到这个类的成员函数
还有我测试的结果是
typedef
void (test2::* Func)(void *lp);
前面加不加__thiscall都没有关系,实际上编译器似乎很智能,居然能够找到。
能力值:
( LV12,RANK:270 )
10 楼
所以才说不知道你想做什么?……
你想实现什么目的,或许有别的方法,像你这样直接传函数地址即使能实现,也可能会出问题,原因楼上几位都说了。
能力值:
( LV2,RANK:10 )
11 楼
据我观察,lz,是想做一个回调功能。
用类指针吧
能力值:
( 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 ;
};
能力值:
( LV2,RANK:10 )
13 楼
没有看明白,你的意图......
能力值:
( LV12,RANK:360 )
14 楼
最后还是把类成员函数改成静态了..谢谢大家回复
能力值:
( LV2,RANK:10 )
15 楼
回调类的非静态成员函数,要手动传this指针才可以实现!C++类成员函数指针转普通的指针还是有办法实现的,欺骗下编译器而已,哈哈!
能力值:
( 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()