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

У меня возникли проблемы с созданием метода класса оболочки обратного вызова, который должен использоваться сторонней библиотекой; Библиотека JackAudio.

Я был в состоянии сделать оболочку для функции обратного вызова JackAudio, которая нуждается в двух аргументах.

У меня просто возникают проблемы при создании функции обратного вызова для конкретной функции, которая нуждается в const char * в качестве аргумента.

До сих пор я был в состоянии сделать библиотеку JackAudio jack_set_sample_rate_callback Функция использует пользовательский класс и может быть выполнена следующим образом:

SoundClass Sound;

SoundClass * SoundPointer = &Sound;

jack_set_sample_rate_callback(
client,
SoundClass::SampleRateCallbackWrapper,
SoundPointer
);

И класс выглядит примерно так:

SoundClass
{

int SampleRateCallback( jack_nframes_t nframes )

{
//executes some code when called.
}

static int SampleRateCallbackWrapper( jack_nframes_t nframes, void * arg )
{
return static_cast < SoundClass* > ( arg )->SampleRateCallback( nframes );
}
};

Все вышеперечисленное работает хорошо, без проблем.

Проблема у меня сейчас с функцией обратного вызова JackAudio jack_set_error_function

Вот что я попробовал:

static void  ErrorCallbackWrapper( const char * arg  )
{
return static_cast < SoundClass*>( arg )->SomeErrorFunction();
}

Но я получаю error: invalid static_cast from type ‘const char*’ to type ‘SoundClass*’

Я понимаю суть, почему это происходит, я просто не знаю, что делать для решения.

Заранее спасибо за любую помощь, ребята.

0

Решение

Предполагая, что Jack API написан для языка C, есть формальный проблема уже с рабочим обратным вызовом, который у вас есть. А именно, что тогда должно быть extern "C"и что в качестве статической функции-члена это не может быть. Так что формально это должна быть автономная функция.

документация что вы ссылаетесь на jack_set_error_function дает эту подпись, предположительно выраженную в C:

void jack_set_error_function( void(*)(const char *) func);

Для C ++ обратный вызов должен быть принят extern "C", так,

extern "C" void MyErrorFunction( char const* errorMessage )
{
// Whatever, e.g. post a message to the GUI event queue, or terminate.
}

Если вы хотите, чтобы эта функция в свою очередь вызывала метод для объекта, то, если библиотека не предоставляет какой-то специальный механизм, чтобы помочь вам, вам просто нужно использовать один из следующих методов:

  • переменная области имен пространства, к которой обращается обратный вызов, или

  • динамически генерируемый обратный вызов.

C ++ пока еще не поддерживает второй подход, так что первый четко обозначен — если Вы хотите обратный вызов метода объекта.


РЕДАКТИРОВАТЬК сожалению, я забыл упомянуть,

        объявления функций в документации API синтаксически неверны.

Например. подпись документации

void jack_set_info_function( void(*)(const char *) func );

просто не будет компилироваться со стандартным компилятором. Не как C и не как C ++. Это синтаксически неверно на обоих языках.

Вместо этого должно быть

void jack_set_info_function( void(*func)(const char *) );

Поскольку документация, очевидно, генерируется DOxygen, очевидно, что она была сгенерирована из исходного кода, который компилируется. Если это так, то это ошибка в DOxygen и проблема с обеспечением качества библиотечного провайдера. Однако это может быть проблемой, которая лежит исключительно на поставщике библиотеки, или, я могу ошибаться в предположении, что это библиотека C?

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]