我有以下内容:
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”,但编译器不允许我 - 我该怎么做错了?
感谢您的帮助!
答案 0 :(得分:2)
当你有一个指向成员的指针函数时,为了调用它,你还必须有一个指向你正在用于调用的对象的指针。
但你的代码:
fn(data);
没有这样的对象指针。您可能假设一个对象与成员函数指针相关联 - 但它不是。
试试这个:
(that->*fn)(data);
that
是指向BrowserApp
对象的指针。它需要传入requestFinished
函数,或者以某种方式存储在NetRequest
对象中 - 可能在fn
设置的同时。
答案 1 :(得分:0)
我建议你研究std::function
和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::bind
将函数从BrowserApp
类绑定到std::function
对象:
BrowserApp app;
NetRequest request("some string", std::bind(&BrowserApp::SomeFunction, app));
使用std::function
的好处是回调函数不再必须是BrowserApp
成员函数,它可以通过任何函数,包括lambda表达式。< / p>