简要
有时我们想把一个类封装得更隐蔽,提供的公用接口更少,而成员函数又比较多,而且,还不得不给成员函数一个公开的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); 就可以调用私有的需多接口函数,这个是可以在很多项目中用到的。