<span style="font-size:18px;">
#include <iostream>
using namespace std;
class widget {
void f(int) const { cout << "widget::f()\n"; }
void g(int) const { cout << "widget::g()\n"; }
void h(int) const { cout << "widget::h()\n"; }
void i(int) const { cout << "widget::i()\n"; }
enum { count = 4 };
void (widget::*fptr[count])(int) const;
public:
widget() {
fptr[0] = &widget::f;
fptr[1] = &widget::g;
fptr[2] = &widget::h;
fptr[3] = &widget::i;
}
void select(int I, int J) {
if(I < 0 || I >= count) return;
(this->*fptr[I])(J);
}
int Count() { return count; }
};
int main() {
widget w;
for(int i = 0; i < w.Count(); i++)
w.select(i, 47);
}
</span>
感覺這個代碼會很有用,夠抽象。
但是再類的内部直接實作函數主體,如果放在外面就要聲明與定義分離了。
現在說說上面的邏輯:
類中實作若幹函數,又定義了一個const函數指針數組,來分别指向這些函數,就是說通過數組的索引你就能直接調用這些函數了。
再看main函數中,先執行個體化一個類,然後循環裡調用select函數,select函數在類的内部已經實作調用指針數組的功能。
可能會用到的場合:
當要一個對象有很多可能的行為或者功能時,這些行為就用某些函數來實作了,通過函數指針數組,你就能很好的将這些行為封裝起來,使用者通過你給的select函數來實作某種功能,這樣的好處一個是封裝代碼,另一個是要添加或者修改某些功能的時候,隻需要在類裡面修改對于那個函數的代碼就可以了。用這個方法,類的實作者可以改變大量函數而不影響使用這個類的代碼,這有點多态的功能了。