Вопрос по c++, c, interop, callback – Использование функции-члена класса C ++ в качестве функции обратного вызова C

39

У меня есть библиотека C, для регистрации которой требуется функция обратного вызова для настройки обработки. Тип функции обратного вызова:int a(int *, int *).

Я пишу код C ++, подобный следующему, и пытаюсь зарегистрировать функцию класса C ++ в качестве функции обратного вызова:

<code>class A {
  public:
   A();
   ~A();
   int e(int *k, int *j);
};

A::A()
{
   register_with_library(e)
}

int
A::e(int *k, int *e)
{
  return 0;
}

A::~A() 
{

}
</code>

Компилятор выдает следующую ошибку:

<code>In constructor 'A::A()',
error:
 argument of type ‘int (A::)(int*, int*)’ does not match ‘int (*)(int*, int*)’.
</code>

Мои вопросы

Прежде всего, можно ли зарегистрировать функцию члена класса C ++, как я пытаюсь сделать, и если да, то как? (Я прочитал 32,8 наhttp: //www.parashift.com/c++-faq-lite/mixing-c-and-cpp.htm. Но по моему это не решает проблему) Есть ли альтернативный / лучший способ справиться с этим?

Ваш Ответ

1   ответ
40

Нестатические функции-члены класса A имеют неявный первый параметр типаclass A* что соответствуетэт указатель Вот почему вы можете зарегистрировать их, только если в сигнатуре обратного вызова также есть первый параметрclass A* тип

да. это решение сработало. Что меня смущает, так это то, что компилятор не показывал ошибку int (A ::) (A, int, int *) ’не совпадает с‘ int () (int, int *) Methos
Он сделал, но поставив (A: :), что означает, что функция является частью класса A, что оттуда подразумевает указатель thi GManNickG
Мне просто любопытно ... это указано в стандарте? Я просто заглянул в раздел о классах и не нашел этого. Тем не менее, очень интересно. Я просто не думаю, что каждый компилятор обязательно должен обрабатывать нестатические функции-члены таким образо Tom
@ Methos, говоря, что функции-члены имеют неявный первый параметр, не означает, что этот параметр действительно существует. Это означает, что концептуально, это там. Johannes Schaub - litb
@ Том, стандарт называет его «неявным параметром объекта», и он имеет тип A & для неконстантных функций-членов, A const & для константных функций-членов, A volatile & для volatile ... и так далее. Это ссылка, в то время как «это» является указателем - в основном из-за истории. Объект, для которого вызывается функция-член, называется «подразумеваемый объектный аргумент». Параметр неявного объекта обрабатывается как скрытый первый параметр с целью разрешения перегрузки - но все это только концептуально, ничего такого, что действительно должно быть там Johannes Schaub - litb

Похожие вопросы