有時,設計者須把函式當作參數,輸入進其他函式中,以方便「在函式中執行函式」。比如以「函式A」做為「函式B的輸入參數」,可使程式碼的撰寫更方便。這需要透過一個所謂的「函式指標」。
(1):
class point //宣告一類別point
{
public:
int x,y;
point(int x_,int y_){x=x_;y=y_;}};
void special_move1(point &P) //宣告一函式special_move1
{
if(P.x>=P.y){P.y++;cout<<"this point go up to "<<P.x<<","<<P.y<<endl;}
else{P.x++;cout<<"this point go right to "<<P.x<<","<<P.y<<endl;}
}
void special_move2(point &P) //宣告一函式special_move2
{
if(P.y>0){P.y=-(P.y+1);}
else {P.y=-(P.y-1);}
if(P.x>0){P.x=-(P.x+1);}
else {P.x=-(P.x-1);}
cout<<"this point go to "<<P.x<<","<<P.y<<endl;
}
void move_n_step(point& P1,void (*f)(point&),int n)
{ //宣告一函式move_n_step,其輸入參數列可以輸入一個函式,這個輸入函式的回傳值為void,輸入參數型別為point&。用 回傳值 (*自訂函式指標)(輸入參數型別) 代表此一輸入函式。
for(int i=0;i<n;i++)
{(*f)(P1);} //用(*自訂函式指標)(輸入參數型別) 來執行輸入函式。
}
};
int main(int argc, char *argv[]) //主程式在此
{
point P1(1,1);
move_n_step(P1,special_move1,10);
move_n_step(P1,special_move2,10);
}
註:自訂函式指標只要是英文字母開頭就可以,如:Q、K1、jack、bbbddd12345,隨設計者高興。
(2) 如果嫌上述寫法過於麻煩,也可以用樣板的方式撰寫,將上述:
void move_n_step(point& P1,void (*f)(point&),int n)
{
for(int i=0;i<n;i++)
{(*f)(P1);}
}
改成:
template<class Q1>
void move_n_step(point& P1,Q1 f , int n)
{
for(int i=0;i<n;i++)
{(*f)(P1);}
}
其餘完全不用更改,便可達到相同的執行效果。
留言列表