天天看點

指針數組,指針指向const成員函數

<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函數來實作某種功能,這樣的好處一個是封裝代碼,另一個是要添加或者修改某些功能的時候,隻需要在類裡面修改對于那個函數的代碼就可以了。用這個方法,類的實作者可以改變大量函數而不影響使用這個類的代碼,這有點多态的功能了。

繼續閱讀