C+ 关于类成员函数指针问题 作为函数参数传递过去后地址出现问题 贴上汇编
我在一个类的成员函数中将这个类的另一个函数的指针作为参数传递给另外一个类的成员函数
在用函数指针调用的时候发现指针有问题
不知道什么原因 求解
调用的地方 :
pClassFun pCallFun = &Gameplus::NBomb::CreateFlower;
m_pMovieMaker->RegistMovie(pCallFun);
其中 :
#define CALLBACKPROXY Gameplus::NBomb
typedef void (CALLBACKPROXY::*pClassFun)();
运行到这里的 pCallFun值为0x00411a3c
而且测试 (this->*pCallFun )(); 正常调用
在RegistMovie的代码如下:
int CHrMovieMaker::RegistMovie(pClassFun pFun )
{
(m_pCallbackProxy->*pFun)();
}
这时候的pFun 值为0x00411a3c 但是运行到调用的时候报错

传入后,上下文发生了变化:你肯定是在(m_pCallbackProxy->*pFun)();处或之前下的断点,此时pCallFun还未附加于任何上下文(Gameplus::NBomb对象),因此IDE显示其原来的值(偏移):
lz再仔细查查代码了
[解决办法]
这个,成员函数指针,不能胡乱传递的,只有静态函数可以像C的函数一样用指针传递函数 。
成员函数指针另有语法。
下面是成员函数指针的简单例子。
class C1{
int x,y;
int setx(int x0){x=x0;};
int sety(int y0){y=y0;};
};
typedef int C1::(*funptr)(int);
funcptr p[2]={C1::setx,C1::sety};
int main()
{
C1 c1;
C1 *pc1=&c1;
c1.p[0](10);
c1.p[1](11);
pc1->p[0](10);
pc1->p[1](11);
return 0;
}
非静态成员函数里,隐藏了一个this指针,这个是C式样程序不能模拟的。
只有通过成员语法,才能正确调用;
存储成员函数指针,只能用成员语法,同样成员变量指针也有同样的成员语法
[解决办法]
搞错了要这个样子才行
class C1{
int x;
int y;
public:
int setx(int x0){return x=x0;};
int sety(int y0){return y=y0;};
};
class C1_proxy
{C1 &c;
public:
C1_proxy(C1& ref):c(ref){};
C * operator ->(){return &c;};
const C1 * operator ->()const {return &c;};
C1 & operator *(){return c;};
const C1 & operator *()const{return c;};
operator C1*(){return &c;}
operator const C1 *()const{return &c;}
};
typedef int( C1::*funcptr)(int) ;
funcptr p[2]={&C1::setx,&C1::sety };
C1 c1,*pc1=&c1;
(c1.*p[0])(10);
(c1.*p[1])(11);
(pc1->.*p[0])(10);
(pc1->*p[1])(11);
[解决办法]
#include<iostream>
using namespace std;
class A{
public:
A():x(0){};
A(int x0):x(x0){};
void func()
{
cout<<x<<endl;
}
private:
int x;
};
class B{
public:
B():m_a(new A){};
B(int x):m_a(new A(x)){};
typedef void (A::*CallBackFunc)();
void registerFunc( CallBackFunc f)
{
(m_a->*f)();
}
~B(){delete m_a;}
private:
A *m_a;
};
int main(int argc, char* argv[])
{
B b(10);
b.registerFunc(A::func);
cout<<endl;
return 0;
}
[解决办法]
因为这个函数有个隐藏参数 this指针,他需要一个A类的对象。
m_pCallbackProxy 必须有某种中途径,转换为Gameplus::NBomb类对象的指针;
这个指针,必须有一个真实存在的对象,和他相对应。
m_pCallbackProxy 不能是NULL指针,也不能是野指针。
PS:
1)注意指针转换有时会出错,那么就会有一个NULL指针。
程序崩溃。
2)如果m_pCallbackProxy没有初始化,或者初始化失败,就有了没有初始化的指针(野指针)
程序崩溃。
3)
如果m_pCallbackProxy初始化为NULL,并且没有重新赋值,那么就会有一个NULL指针。
程序崩溃。
[解决办法]
m_pCallbackProxy 没有贴出代码,
所以没有方法知道这个数据初始化没有,会不会出错。