2014-01-28 2 views
0

Я искал это на форуме, и я попробовал несколько решений, которые я нашел здесь, но никто не работал. Моя проблема в том, что мне нужно передать частный член класса как указатель на аргумент функции, поэтому я попробовал поставить этот метод как статический, но он не работал, следует за кодом.Передача частного класса класса класса в качестве указателя на функцию

class monitor { 
    public: 
    monitor(device *dev); 
    ... 
    void exec(); 
    void end(); 
    virtual ~monitor(); 

    private: 
    static pcap_handler process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr, 
          const u_char * packet); 
    static void thread_func(monitor *mon); 
     device *dev; 
     }; 

и как используется метод:

void monitor::exec() { 
    std::thread t (monitor::thread_func, this); 
} 

void monitor::thread_func(monitor *mon) { 
    pcap_loop(mon->dev->get_descr(), -1, monitor::process_packet, reinterpret_cast<u_char*>(mon)); // error in this line 
} 

pcap_handler monitor::process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr, 
          const u_char * packet) { 
    monitor *mon = reinterpret_cast<monitor*>(arg); 

    ... 
} 

Ошибки были:

error: invalid conversion from ‘void (* (*)(u_char*, const pcap_pkthdr*, const u_char*))(u_char*, const pcap_pkthdr*, const u_char*) {aka void (* (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*))(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ to ‘pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ [-fpermissive] 

error: initializing argument 3 of ‘int pcap_loop(pcap_t*, int, pcap_handler, u_char*)’ [-fpermissive] 

следует код прототипов функций Libpcap

typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes); 

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user); 

Я попробовал несколько решений explai Нед в другой пост, как:

pthread in a class

Private member function that takes a pointer to a private member in the same class

C++: Calling member function via pointer

Function pointer to class member function problems

Но ни одно из этих сообщений не решить мою проблему, так что, есть кто-то какой-то наконечник?

Спасибо ...

+0

Что вы возвращающиеся из 'process_packet'? – 0x499602D2

+0

Что вам нравится в публикации http://sscce.org? – Yakk

+0

На самом деле я ничего не возвращаю, я возвращаю только возвращение. – Alex

ответ

1

process_packet функция возвращает pcap_handler. Это не pcap_handler.

Чтобы сделать это pcap_handler, изменить свою линию:

static void process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr, 
         const u_char * packet); 
Смежные вопросы