C++成员函数指针

C++成员函数指针实现简单的信号槽

#include <QDebug>
class ppp
{
public:
    QString a;
    void printA(void)
    {
        qDebug()<<a;
    }

    void printB(QString b)
    {
        qDebug()<<a<<b;
    }
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    void (ppp::*func)();
    void (ppp::*funcB)(QString);

    /* func实际上是成员函数printA在类ppp中的偏移地址,
     * funcB是printB的偏移地址,最终要根据实例对象加
     * 上基准地址*/
    func = &ppp::printA;
    funcB = &ppp::printB;
    ppp t1;t1.a = "t1";
    ppp t2;t2.a = "t2";

    /* 这里的t1.*func必须用括号括起来:(t1.*func),
     * 另外这里函数指针需要对象来引用,因为func只是
     * 偏移地址*/
    (t1.*func)(); // 输出:"t1"
    (t2.*func)(); // 输出:"t2"

    (t1.*funcB)("printB");// 输出:"t1" "printB"
    (t2.*funcB)("printB");// 输出:"t2" "printB"
}

现在利用回调函数的方式实现一个类似于Qt信号槽的功能,先利用模板函数兼容不同类:

#include <QHash>
template<class T>
void *recallMap()
{
    typedef void (T::*Func)();
    static QHash<QString, Func> hash;
    return &hash;
}

template<class T>
void attach(QString mask, void (T::*func)())
{
    typedef void (T::*Func)();
    QHash<QString, Func> *hashP = static_cast<QHash<QString, Func> *>(recallMap<T>());
    if (hashP != NULL)
    {
        hashP->insert(mask, func);
    }
}

template<class T>
void recall(T *t, QString mask)
{
    typedef void (T::*Func)();
    QHash<QString, Func> *hashP = static_cast<QHash<QString, Func> *>(recallMap<T>());
    if (t != NULL && hashP != NULL && hashP->contains(mask))
    {
        (t->*(hashP->value(mask)))();
    }
}

下面是链接和调用的代码:

    ppp t1;t1.a = "t1";
    ppp t2;t2.a = "t2";
    
    attach("printA", &ppp::printA);
    attach("printC", &ppp::printC);

    recall(&t1, "printC");
    recall(&t2, "printC");

这样就可以将字符串跟函数直接关联起来,一般字符串是信号或事件,函数作为对信号或事件的响应。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值