Вызов функции C в программе C ++

0

Я использую библиотеку ac, у которой есть API, ожидающий указателя функции C.

Можно ли передать функцию-член класса C++ для этого указателя функции?

Вот C API:

typedef int (*WRITE_FUNC_T)(void *d, char *buffer, int n);

void start(WRITE_FUNC_T callback);

class MyClass {
    public:
    int mycallback(void *d, char *buffer, int n);
}

Я хочу передать MyClass::mycallback для start(). Когда я это делаю, я получил ошибку компиляции, поскольку аргумент типа не совпадает.

Теги:

4 ответа

1
Лучший ответ

Это сработало для меня:

#include <iostream>
#include <sstream>

typedef int (*WRITE_FUNC_T)(void *d, char *buffer, int n);

void start(WRITE_FUNC_T callback) {}

class MyClass {
public:
  int mycallback(char *buffer, int n) {
    return 0;
  }
  static int newcallback(void *d, char *buffer, int n) {
    return static_cast<MyClass*>(d)->mycallback(buffer, n);
  }
};

int main() {
  start(&MyClass::newcallback);
}
  • 0
    Это работает только если d фактически указывает на MyClass . поэтому в другом месте должен быть какой-то код, который отправляет этот указатель в библиотеку C, чтобы обратный вызов мог его передать. Обычно обратные вызовы следуют за шаблоном void start(WRITE_FUNC_T callback, void *d); , Так что абонент может проходить d обратно к вам.
0

Я надеюсь, что это помогает вам.

class ClassA
{
public:
    int Callback(void *d, char *buffer, int n) 
    { 
        return 0;
    }
};

typedef int(ClassA::*FncPtr)(void *d, char *buffer, int n);

int main(int argc, const char** args)
{
    ClassA* classA = new ClassA();

    int retVal = (*classA.*(&ClassA::Callback))(0x00,0x00,0);

    return 0;
}
0

Потому что mycallback - это метод класса, поэтому его фактическая реализация - это что-то вроде int mycallback(MyClass &this, void *d, char *buffer, int n), он несовместим с WRITE_FUNC_T. Попытайтесь превратить его в static метод, несмотря на то, что он может не соответствовать вашим потребностям.

0

попробуйте static int mycallback(void *d, char *buffer, int n);

Ещё вопросы

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