歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++函數指針

C++函數指針

日期:2017/3/1 10:10:54   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved