c++里怎么把类中的函数的指针传递给另一个类呀

主要就是现在写了2个类,然后在类A中调用了类B中的一个方法bfunc,但是在这个bfunc结束的时候,还想要能够调用一个方法,但是现在希望这个方法可以是写在类A中的,然后... 主要就是现在写了2个类,然后在类A中调用了类B中的一个方法bfunc,但是在这个bfunc结束的时候,还想要能够调用一个方法,但是现在希望这个方法可以是写在类A中的,然后把函数指针传递到B里面,再在bfunc的最后面执行这个类A中的方法,但是现在就是不会传进去。 展开
 我来答
韧劲9
推荐于2017-09-18 · TA获得超过9223个赞
知道小有建树答主
回答量:1638
采纳率:92%
帮助的人:340万
展开全部
class A

{

public:

static void staticmember(){cout<<"static"<<endl;} //static member

void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member

virtual void virtualmember(){cout<<"virtual"<<endl;};//virtual member

};

int main()

{

A a;

//static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符

void (*ptrstatic)() = &A::staticmember;

//nonstatic成员函数 取得的是该函数在内存中的实际地址

void (A::*ptrnonstatic)() = &A::nonstatic;

//虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果

void (A::*ptrvirtual)() = &A::virtualmember;

//函数指针的使用方式

ptrstatic();

(a.*ptrnonstatic)();

(a.*ptrvirtual)();

}
.
bestbandari
推荐于2018-08-26
知道答主
回答量:23
采纳率:0%
帮助的人:8.9万
展开全部
可以在bfunc中加一个传入参数A *a;然后调用你想要的a->afunc。而不必操作指针。

A中:
b.bfunc(this);
B中:
bfunc(A*a){
a->afunc();
}

建议尽量不用这样的操作,这说明类的设计有点问题,可能会出现死循环A->B->A->B.....
而且看起来还是像在用c的思想写c++程序。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ssilspro
推荐于2017-09-18 · TA获得超过2625个赞
知道大有可为答主
回答量:1148
采纳率:0%
帮助的人:1696万
展开全部
非静态的成员函数需要访问类内的非静态成员,a.fun()访问的a的成员,b.fun()访问的是b的
所以编译器会在背后传递一个this指针,指向调用非静态成员函数的对象,这样函数内就可以通过this指针访问非静态成员,而静态成员是全部对象共享的,不需要this指针
用C语言表示就类似这样:
struct A{int a;};
void A_set(struct A *this,int m) // void A::set(int m)
{
this->a=m;
}
int main(){
struct A one,two;
A_set(&one,5); //one.set(5)
A_set(&two,2); //two.set(2)
}

所以定义成员函数指针就需要类的类型和对象
class A{
public: void a(int m){}
void b(int m){}
};
int main(){
A one,two;
one.a(1);
void (A::*p)(int m); // 用 ::* 指定为 A类void(*)(int m)类型成员函数 的指针
p=&A::b; // 绑定 A类的 b 成员函数,不要忘掉加 &
(two.*p)(2); // 用two对象调用成员函数指针, 对象指针用 ->* : ( (&two) ->* p)(2)
}
注意要加括号,参数列表的括号的优先级要高
更多追问追答
追问
还是有点不明白,假设是这样子的呢,我就简写了,不分头文件了
class A{
void init(){
B b = new B;
b.bfunc();

}

void a(int m){}

}
class B{
void bfunc(){
想在这里调用a方法

}

}
就是不是在main方法,是在C++的类方法中要怎么办
追答
都一样啊,
你想要在A里 把A的函数传到B的函数里掉用?
你要把 对象 和 要绑定的函数 传过去

class A;
class B{
public:
void bfunc( void(A ::* pfun)(int), A *p){
(p ->* pfun)(111);
}
};
class A{
public:
void init(){
B b; // b不是指针,不用new

b.bfunc(&A::a,this);
A one;
b.bfunc(&A::b,this);
b.bfunc(&A::b,&one);
}
void a(int m){}
void b(int m){}
};
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
五五开Fl
2012-11-22 · 超过18用户采纳过TA的回答
知道答主
回答量:180
采纳率:0%
帮助的人:51.5万
展开全部
重新定向指针啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式