2016-11-11 125 views
-1

如何使用實例化類的成員函數作爲函數指針?C++ |如何使用成員函數作爲函數指針

BEFORE:

main.cpp : 

void packetShower(data_t const& data) { 
     // showing so data 
    } 

.... 

// called with : 
std::shared_ptr<Net::ARawSocket> rawSock = std::make_shared<Net::LinuxRawSocket>(packetShower); 

和它運行良好。 的packetShower功能是一個簡單的靜態方法爲我main.cpp

NOW:

我有一個實例化類InstancepacketShower實例函數

namespace App { 
class Instance { 
public: 
    Instance() = default; 
    ~Instance() = default; 

    int run(int ac, char *av[]); 
private: 
    void init(); 

    void packetShower(data_t const& data) 
    }; 
} 

,在我run()方法,我嘗試創建一個函數指針我的packetShower功能:

namespace App { 

void Instance::init() { 
... 
} 

void Instance::packetShower(data_t const& data) { 
     ..... 
} 

int Instance::run(int argc, char** argv) { 
    init(); 

    // and I tried : 

     void (Instance::*shower)(data_t const& data) = &Instance::packetShower; 

     std::shared_ptr<Net::ARawSocket> rawSock = std::make_shared<Net::LinuxRawSocket>(shower); 


    // but It generate a big error 

    } 
} 

任何想法我可以做到這一點?

謝謝!

+0

'Net :: LinuxRawSocket' ctor接受哪種類型? – Slava

+0

我得到的錯誤是:'沒有匹配函數調用'Net :: LinuxRawSocket :: LinuxRawSocket(void(App :: Instance :: **)(const std :: vector &))'' 但正如我所說,這樣做的「之前」的方式與一個func指針,但現在我嘗試用一​​個實例成員的func指針來做到這一點 – F4Ke

+0

你能閱讀和理解我的問題嗎?我可以重述它。你能提供在Net :: LinuxRawSocket構造函數中被接受爲回調的類型的定義嗎? – Slava

回答

0

聲明packetShowerstatic並將Instance::packetShower指定爲shower

如果函數指針將被用作回調,則this指針可以作爲用戶數據傳遞和,packetShower的聲明會改變如下,如果你被允許更改函數聲明:

class Instance { 
... 
    static void packetShower(data_t const& data, void *userData) { 
     Instance *i = (Instance)userData; 
     ... 
    } 
... 
};