2016-11-11 159 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; 
     ... 
    } 
... 
};