2013-10-02 40 views
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」,但編譯器不會讓我 - 我是什麼請問做錯了?

感謝您對您的幫助!

+1

正確調用語法應該是'這 - >(* FN)(數據);' –

+1

對不起,不'這個 - >',但需要到'BrowserApp'實例有效的指針! –

+2

「不起作用」不是錯誤消息。 –

回答

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的好處是,回調函數no更長的是一個BrowserApp成員函數,它可以通過的任何函數,包括lambda表達式。

+0

假設OP想要使用/可以使用/使用C++ 11。 – Neet

2

當你有一個指針到成員函數,以便通過它來調用你還必須有一個指向您使用呼叫的對象。

但是你的代碼:

fn(data); 

有沒有這樣的對象的指針。您可能正在假定一個對象與成員函數指針相關聯 - 但事實並非如此。

嘗試這種情況:

(that->*fn)(data); 

that是一個指向BrowserApp對象。這將需要通過任何在該requestFinished功能,或以某種方式保存在NetRequest對象 - 可能是在當fn被設置在同一時間。

+0

但是'this'是'NetRequest',而不是'BrowserApp'。 – Neet

+0

@奈特:再看一眼。 –

+0

是的,這工作:) – Neet