C++函式指標陣列的使用方法
2015-11-24
一、 緣起
什麼情況下,想到將函式指標陣列來的呢?是由於近期寫的一個程式中,有一系列順序化的函式,且這些函式的形式基本一致,需要對每一步的執行結果進行判斷,是否執行成功,若執行成功,則繼續執行下一函式,如果執行失敗,則終端執行並退出。
由於依次要執行的函式比較多,有5個。按照常規思路來寫程式碼的話,就是對每一步執行的結果進行IF-ELSE判斷,根據結果決定下一步執行的內容。目前只有5個函式需要執行,如果有更多類似的函式需要按順序執行的話,那麼這個函式將會非常長,不便於閱讀,程式碼也不美觀。
考慮到當前使用的函式的引數列表和返回值基本一致,因此考慮是否可以採用遍歷函式指標陣列的方式,把函式指標存放到陣列中,遍歷陣列,從而依次執行對應指標指向的函式,並對結果逐一判斷,並做相應處理。這樣對結果處理部分可以採用統一的方式,判斷非常方便,程式碼也非常簡潔清晰,閱讀起來也比較容易。
於是上網查詢相關資料,瞭解函式指標陣列的使用方法。通過查詢資料,C++函式指標陣列的使用可以分為兩類,一類是全域性函式的指標陣列的使用(與C語言相同),另一類是C++類的成員函式指標陣列的使用。現就這兩種情況分別進行整理。
二、 C中的全域性函式指標陣列使用
(一) 要求
1. 要求被呼叫的一系列函式的引數列表和返回值型別均完全一致;
2. 要求將所要呼叫的函式指標放入函式指標陣列中(如果函式必須含順序執行,那麼函式指標的存放順序需要與呼叫的順序保持一致);
3. 呼叫時,從陣列中取出要執行的函式指標,執行對應的函式即可。
(二) 程式碼案例
#include <iostream>
using namespace std;
void function0(int);
void function1(int);
void function2(int);
int _tmain(int argc, _TCHAR* argv[])
{
void (*f[3])(int) = {function0,function1,function2}; //將這3個函式指標儲存在陣列f中
intchoice;
cout<< "Enter a number between 0 and 2,3 to end: ";
cin>> choice;
//處理使用者的選擇
while((choice >= 0) && (choice <3))
{
//呼叫陣列f中的一個函式
(*f[choice])(choice); //f[choice]選擇在陣列中位置為choice的指標。
//指標被解除引用,以呼叫函式,並且choice作為實參傳遞給這個函式。
cout<< "Enter a number between 0 and 2,3 to end: ";
cin>> choice;
}
cout<< "Program execution completed." << endl;
system("pause");
return0;
}
void function0(int a)
{
cout<< "You entered" << a << " so function0 wascalled\n\n";
}
void function1(int b)
{
cout<< "You entered" << b << " so function1 wascalled\n\n";
}
void function2(int c)
{
cout<< "You entered" << c << " so function2 wascalled\n\n";
}
三、 C++類中的成員函式指標陣列使用
(一) 要求
C++類中的成員函式指標陣列使用時,與C的使用方法不同。要求如下:
1. 要求放入函式指標陣列的成員函式的引數列表和返回值型別均完全一致;
2. 定義一個函式指標陣列,且指定陣列長度(等於要存放的成員函式的個數),並在初始化時將成員函式指標賦給對應的陣列變數中(如果函式必須含順序執行,那麼函式指標的存放順序需要與呼叫的順序保持一致);
3. 呼叫時,從陣列中取出要執行的函式指標,執行對應的函式即可。呼叫時要使用“->*”或“.*”來指向陣列元素,否則編譯時會報錯。
(二) 程式碼案例
/*
*測試成員函式指標陣列的小程式
*程式碼關鍵點已經用紅色標註
*/
#include <iostream>
using namespace std;
class Test
{
public:
Test();
~Test();
private:
void add5(){ res+=5;}
void add6(){ res+=6;}
//這個2至關重要,在VC下沒寫會報錯,但在QT裡沒報,但析構時出錯!
void (Test::*add[2])();
public:
void DoAddAction();
void Display();
private:
int res;
};
Test::Test()
{
//注意這裡的寫法
add[0]=&Test::add5;
add[1]=&Test::add6;
res=0;
}
Test::~Test()
{
}
void Test::DoAddAction()
{
for (int i=0;i<2;i++)
{
//使用類成員函式指標必須有“->*”或“.*”的呼叫
(this->*add[i])();
}
}
void Test::Display()
{
cout<<"The res is:"<<res<<endl;
}
int main()
{
Test * test=new Test();
test->DoAddAction();
test->Display();
delete test;
return 0;
}
四、 總結
以上方法,說明了在C和C++類中使用函式指標陣列的方法,顯而易見,使用函式指標陣列的方法,可以較為方便地呼叫函式,且使得程式碼簡潔美觀,程式碼質量提供一個檔次。
在今後的程式開發過程中,遇到類似的問題,在可以使用函式指標陣列的情況下,可以嘗試只有函式指標陣列,讓開發工作變得更容易,更有樂趣。