成员函数指针 - 如何做到这一点?

时间:2013-10-02 15:27:19

标签: c++

我有以下内容:

    class NetRequest: public QObject {
        Q_OBJECT
    public:

            NetRequest(QString postData, void(BrowserApp::*f)(QByteArray));
            QString postData;
            void (BrowserApp::*fn)(QByteArray);
        public slots:
            void requestFinished(QNetworkReply *r);
        }

和cpp是:

        NetRequest::NetRequest(QString postData, void(BrowserApp::*f)(QByteArray)) {
            this->postData = postData;
            this->fn = f;
        }

        void NetRequest::requestFinished(QNetworkReply *r) {
            QByteArray data;
                fn(data);<--- this doesn't work
        }

我试图在requestFinished中调用函数“fn”,但编译器不允许我 - 我该怎么做错了?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

当你有一个指向成员的指针函数时,为了调用它,你还必须有一个指向你正在用于调用的对象的指针。

但你的代码:

fn(data);

没有这样的对象指针。您可能假设一个对象与成员函数指针相关联 - 但它不是。

试试这个:

(that->*fn)(data);

that是指向BrowserApp对象的指针。它需要传入requestFinished函数,或者以某种方式存储在NetRequest对象中 - 可能在fn设置的同时。

答案 1 :(得分:0)

我建议你研究std::functionstd::bind。在涉及“功能指针”时,它们会以多种方式为您提供帮助。

然后它会看起来像这样:

class NetRequest: public QObject {
    std::function<void(QByteArray)> fn;

    // ...

public:
    NetRequest::NetRequest(QString postData, std::function<void(QByteArray)> f) {
        // ...
        fn = f;
    }

    // ...
};

现在,在创建NetRequest对象的实例时,必须使用std::bind将函数从BrowserApp类绑定到std::function对象:

BrowserApp app;

NetRequest request("some string", std::bind(&BrowserApp::SomeFunction, app));

使用std::function的好处是回调函数不再必须是BrowserApp成员函数,它可以通过任何函数,包括lambda表达式。< / p>