指向類成員函數指針之指針數組


簡要

有時我們想把一個類封裝得更隱蔽,提供的公用接口更少,而成員函數又比較多,而且,還不得不給成員函數一個公開的public公開權限,這時就可以通過成員函數的指針數組來實現只給一個公開接口,然後指向對應私有的成員函數。


效果

點擊每個按鈕打印出對應的提示語句。
這裏寫圖片描述


代碼實例

這是一個對應的小實例,可以通過這個小實例來總結

.h文件

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    enum Function {
        FunctionA = 0,
        FunctionB,
        FunctionC,
        FunctionD,
        FunctionE,
        FunctionF,
        Count = 6
    };
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

    void select(const Function& functionId);
private slots:
    void on_toolButtonA_clicked();

    void on_toolButtonB_clicked();

    void on_toolButtonC_clicked();

    void on_toolButtonD_clicked();

    void on_toolButtonE_clicked();

    void on_toolButtonF_clicked();

private:
    void a();
    void a(int test);
    void b();
    void c();
    void d();
    void e();
    void f();

    void (Dialog::*pa[Count])() = {};

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

.cpp文件

#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    pa[0] = &Dialog::a;
    pa[1] = &Dialog::b;
    pa[2] = &Dialog::c;
    pa[3] = &Dialog::d;
    pa[4] = &Dialog::e;
    pa[5] = &Dialog::f;


}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::select(const Function& functionId)
{
    (this->*pa[functionId])();
}

void Dialog::a()
{
    qDebug() << "this is a()";
}

void Dialog::a(int test)
{
    qDebug() << "this is a() test" << test;
}

void Dialog::b()
{
    qDebug() << "this is b()";
}

void Dialog::c()
{
    qDebug() << "this is c()";
}

void Dialog::d()
{
    qDebug() << "this is d()";
}

void Dialog::e()
{
    qDebug() << "this is e()";
}

void Dialog::f()
{
    qDebug() << "this is f()";
}


void Dialog::on_toolButtonA_clicked()
{
    select(FunctionA);
}

void Dialog::on_toolButtonB_clicked()
{
    select(FunctionB);
}

void Dialog::on_toolButtonC_clicked()
{
    select(FunctionC);
}

void Dialog::on_toolButtonD_clicked()
{
    select(FunctionD);
}

void Dialog::on_toolButtonE_clicked()
{
    select(FunctionE);
}

void Dialog::on_toolButtonF_clicked()
{
    select(FunctionF);
}

總結

當然實現這樣的效果直接用一個槽函數實現更爲簡單,但我們這個實例是用來談論函數指針的,所以我們應該注意到向外提供一個公共接口void select(const Function& functionId); 就可以調用私有的需多接口函數,這個是可以在很多項目中用到的。

發佈了88 篇原創文章 · 獲贊 52 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章