c++里怎么把类中的函数的指针传递给另一个类呀
主要就是现在写了2个类,然后在类A中调用了类B中的一个方法bfunc,但是在这个bfunc结束的时候,还想要能够调用一个方法,但是现在希望这个方法可以是写在类A中的,然后...
主要就是现在写了2个类,然后在类A中调用了类B中的一个方法bfunc,但是在这个bfunc结束的时候,还想要能够调用一个方法,但是现在希望这个方法可以是写在类A中的,然后把函数指针传递到B里面,再在bfunc的最后面执行这个类A中的方法,但是现在就是不会传进去。
展开
4个回答
展开全部
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)();
}
.
{
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)();
}
.
展开全部
可以在bfunc中加一个传入参数A *a;然后调用你想要的a->afunc。而不必操作指针。
如
A中:
b.bfunc(this);
B中:
bfunc(A*a){
a->afunc();
}
建议尽量不用这样的操作,这说明类的设计有点问题,可能会出现死循环A->B->A->B.....
而且看起来还是像在用c的思想写c++程序。
如
A中:
b.bfunc(this);
B中:
bfunc(A*a){
a->afunc();
}
建议尽量不用这样的操作,这说明类的设计有点问题,可能会出现死循环A->B->A->B.....
而且看起来还是像在用c的思想写c++程序。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
非静态的成员函数需要访问类内的非静态成员,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)
}
注意要加括号,参数列表的括号的优先级要高
所以编译器会在背后传递一个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){}
};
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重新定向指针啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询