0

我有以下内容:

    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”,但编译器不允许我 - 请问我做错了什么?

谢谢你的帮助!

4

2 回答 2

2

当您有一个指向成员函数的指针时,为了通过它进行调用,您还必须有一个指向您用于调用的对象的指针。

但是你的代码:

fn(data);

没有这样的对象指针。您可能假设一个对象与成员函数指针相关联——但事实并非如此。

尝试这个:

(that->*fn)(data);

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

于 2013-10-02T15:36:32.870 回答
0

我建议你看看std::functionand std::bind。当涉及到“函数指针”时,它们会在很多方面为您提供帮助。

然后它看起来像这样:

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

    // ...

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

    // ...
};

现在,当创建NetRequest对象的实例时,您必须使用std::bindBrowserApp类中的函数绑定到std::function对象:

BrowserApp app;

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

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

于 2013-10-02T15:34:20.033 回答