C+ 关于类成员函数指针有关问题 作为函数参数传递过去后地址出现有关问题 贴上汇编
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创建了正确的对象没有?
------解决方案--------------------
直接m_pCallbackProxy->CreateFlower();
------解决方案--------------------
普通的函数指针是函数的入口地址;但C++类的成员函数的指针不是,它至少不是一个直接可用的"地址"。它其实是成员函数在类中的偏移。
class C
{
public:
int a();//偏移0
int b();//偏移1
int c();//偏移2
};
&C::a == 0;
&C::b == 1;
&C::c == 2;
在传入前,IDE根据当前的上下文自动计算出了pCallFun的“绝对”地址:

传入后,上下文发生了变化:你肯定是在(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;};
我在一个类的成员函数中将这个类的另一个函数的指针作为参数传递给另外一个类的成员函数
在用函数指针调用的时候发现指针有问题
不知道什么原因 求解
调用的地方 :
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 但是运行到调用的时候报错
C++
函数指针
成员函数指针
汇编
------解决方案--------------------
m_pCallbackProxy创建了正确的对象没有?
------解决方案--------------------
直接m_pCallbackProxy->CreateFlower();
------解决方案--------------------
普通的函数指针是函数的入口地址;但C++类的成员函数的指针不是,它至少不是一个直接可用的"地址"。它其实是成员函数在类中的偏移。
class C
{
public:
int a();//偏移0
int b();//偏移1
int c();//偏移2
};
&C::a == 0;
&C::b == 1;
&C::c == 2;
在传入前,IDE根据当前的上下文自动计算出了pCallFun的“绝对”地址:
传入后,上下文发生了变化:你肯定是在(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;};