close

按此前往C++完整教學目錄

 

有時,設計者須把函式當作參數,輸入進其他函式中,以方便「在函式中執行函式」。比如以函式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);

}

註:自訂函式指標只要是英文字母開頭就可以,如:QK1jackbbbddd12345,隨設計者高興。

(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);}

}  

其餘完全不用更改,便可達到相同的執行效果。

 

 

上一篇:樣板類別

下一篇:字串(string)

arrow
arrow
    創作者介紹
    創作者 埃伯 的頭像
    埃伯

    程式語言教學

    埃伯 發表在 痞客邦 留言(0) 人氣()