передача члена класса закрытого метода в качестве указателя на функцию

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);

Я попробовал несколько решений, объясненных в другом сообщении:

pthread в классе

Функция частного участника, которая принимает указатель на частный член в том же классе

C++: вызов функции-члена через указатель

Функциональный указатель на функции функции члена класса

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

Благодаря...

  • 0
    Что вы возвращаете из process_packet ?
  • 0
    Что мешает вам опубликовать sscce.org ?
Показать ещё 6 комментариев
Теги:
callback
pointers
oop
libpcap

1 ответ

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню