Укажите функцию typedef для другой функции в другом классе - PullRequest
0 голосов
/ 10 июля 2019

У меня есть эта функция typedef для класса A.h:

typedef void(*PERCENTAGE_CALLBACK)(float);

И я использую одну из функций класса:

int API_GenerateLayerData(int layerIndex, unsigned char *data, int dataSize, PERCENTAGE_CALLBACK callback);

В другом классе (ClassB.cpp) у меня есть эта функция, которая ничего не возвращает (void), но принимает значение с плавающей запятой, как PERCENTAGE_CALLBACK :

void ClassB::Update(float progress)
{
    emit ChangeProgress((int)progress);
}

Но когда я инициализирую объект PERCENTAGE_CALLBACK, который будет использоваться и передан функции в ClassA, он выдаст ошибку:

public void someFunction()
{
    ClassA *a = new ClassA();

    PERCENTAGE_CALLBACK callback = &ClassB::Update; //Error: cannot convert void ti PERCENTAGE_CALLBACK

    a->API_GenerateLayerData(someNum, someData, count, callback);
}

Как инициализировать обратный вызов класса A, который указывает на функцию обновления класса B?

1 Ответ

2 голосов
/ 10 июля 2019

Вы просто не можете этого сделать, потому что для вызова функции-члена также необходим объект, для которого должен быть вызван член.

Если ваш API только предоставляет указатель на функцию, независимо от того, какая это подпись, выне может обойти эту проблему, даже не используя std::bind и не используя лямбда-функции.Оба они также являются «вызываемыми» объектами, и поэтому им также требуется указатель объекта или ссылка для обратного вызова.

Если вы можете изменить используемый вами API, вам следует изменить регистрацию обратного вызова наstd::function.std::function может работать с простыми указателями на функции, а также с лямбдами или любой другой комбинацией комбинации объекта / метода.

...