2013-10-02 1 views
0

: 나는 requestFinished의 기능 "FN"를 호출하는 것을 시도하고있다멤버 함수 포인터 - 어떻게 수행할까요? 나는 다음과 같은 한

 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 
     } 

하지만 컴파일러는 저를 허용하지 않습니다 - 나는 무엇 이니

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는 제발 잘못 했어?

도움 주셔서 감사합니다.

+1

정확한 값은 'this -> (* fn) (data);' –

+1

'이 아니라'this->'죄송하지만 '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::function 객체에 BrowserApp 클래스에서 함수를 바인딩하는 std::bind을 사용해야합니다

BrowserApp app; 

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

std::function을 사용하면 좋은 점은 콜백 기능이 더 이상 BrowserApp 멤버 함수 여야합니다. 에 의해 람다 식을 포함하여 함수를 사용할 수 있습니다.

+0

OP가 C++ 11을 사용하고 싶거나 사용할 수 있다고 가정하면 11. – Neet

2

member-pointer-to-member-function이있을 때 호출하려면 호출에 사용하는 개체에 대한 포인터가 있어야합니다.

그러나 코드 :

fn(data); 

는 이러한 개체 포인터가 없습니다. 아마도 객체가 멤버 함수 포인터와 연결되어 있다고 가정하고있을 것입니다. 그러나 그렇지 않습니다.

이 시도 :

(that->*fn)(data); 

thatBrowserApp 개체에 대한 포인터입니다. requestFinished 함수에 전달되거나 이 설정되었을 때 같은 방법으로 NetRequest 객체에 저장되어야합니다.

+0

하지만'this '는'BrowserApp'가 아니라'NetRequest'입니다. – Neet

+0

@Neet : 다시 한번 들여다보세요. –

+0

네,이 작품 :) – Neet