簡要
有時我們想把一個類封裝得更隱蔽,提供的公用接口更少,而成員函數又比較多,而且,還不得不給成員函數一個公開的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); 就可以調用私有的需多接口函數,這個是可以在很多項目中用到的。