C++函数指针

今天看了一下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++的类型转换是一个让人极爱并且极恨的——东西~~(吐槽完)

相关推荐