指向类成员函数指针之指针数组


简要

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小K小Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值