今天看了一下C++函数指针
一般的C函数指针,由于没有域说明,用起来还是比较方便
但是C++有域说明了之后,就会发现各种限制接二连三,不过虽然一点也不安全,还是实现了,废话说多了,看题。
我最开始的想法是A是父类,B:public A。B有两个实例b1,b2。如果b1想用b2的函数,如何使用函数指针实现?
class A
{
public:
typedef void (A::*pFuncA)(string str);
pFuncA fun;
};
class B: public A
{
public:
B(string b)
{ my= b; }
/*补充1*/
typedef void (B::*pFuncB)(string);
/*end*/
void Register(pFunc _fun)
{
fun= _fun;
};
void TestFun(string str)
{
cout<<my<<":"<<str<<endl;
}
private:
string my;
};
void main()
{
B b1("b1");
B b2("b2");
b2.Register(...);
}
b2的Register传b1的函数就可以了,结果发现我太天真了,没有办法传b1的函数,不让调用~~“.”只能调用成员,函数名有不是成员
没有办法,只能退而求其次,使用&B::TestFun,发现还是不行,因为类型为pFunc,是A类的函数指针,TestFun是B类的函数,不能转
好吧,没有办法,在定义一个B::*的类型pFuncB
void main()
{
B b1("b1");
B b2("b2");
B::pFuncB pb= &B::TestFun;
int* ptemp= (int*)&pb;
A::pFuncA pa= *(A::pFuncA*)ptemp;
b2.Register(pa);
}
好吧,绕了一大圈,终于把函数传进去了,但是你会发现——这是谁的函数?答案是——你用b2调,调用的是b2的,你用b1调,调的是b1的。原因,很简单,应为代码域是共享的~~
好吧,然后就是如何调用,如果你觉得是b1.fun("函数调用");那就大错特错了~~
调用方式:
(b1.*(b2.fun))("函数调用");
OK完成了~~强烈感觉~~C++的类型转换是一个让人极爱并且极恨的——东西~~(吐槽完)