今天看了一下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++的類型轉換是一個讓人極愛並且極恨的——東西~~(吐槽完)