C ++: обратный вызов в классе

У меня немного сложный класс.

В этом классе у меня есть ссылка:

Private:
IEtApiPtr _pIEtApi;

IEtApiPtr определен в файле .tlh:

_COM_SMARTPTR_TYPEDEF(IEtApi, __uuidof(IEtApi));

IEtApiPtr имеет пустоту с именем «SetRawDataCB»

  virtual HRESULT __stdcall SetRawDataCB (
/*[in]*/ long address,
/*[in]*/ long userData,
/*[out,retval]*/ enum ApiError * pRetVal ) = 0;

Я определил функцию обратного вызова в классе:

void CETAPI::RawDataCB(RawData& r, void* userData)
{
//do something
}

Теперь я хочу установить обратный вызов, используя

_pIEtApi->SetRawDataCB((long)(__int64)(&RawDataCB),0,&result);

… компилятор говорит мне «Ошибка C2276: недопустимая операция для выражения связанной функции-члена».

Что я тут не так сделал?

1

Решение

Это не работает, потому что RawDataCB является функцией-членом, а не глобальной функцией. Вы можете объявить RawDataCB как статическая функция в классе следующим образом, и это будет работать. Однако у вас больше не будет доступа к this указатель (т.е. нет переменных-членов), если вы не добавите его в качестве параметра RawDataCB и, возможно, сделать RawDataCB друг, чтобы получить доступ к частным данным класса в качестве функции-члена, будет иметь. Это можно сделать, обновив объявление функции следующим образом:

class CETAPI {
static void RawDataCB(RawData& r, void* userData);
};

Кроме того, вы можете передать указатель на RawDataCB в качестве указателя на функцию-член, а не указатель на функцию. С указателями на функции-члены можно работать следующим образом, поэтому вы просто передадите объект типа RawDataCBType в SetRawDataCB,

typedef void (CETAPI::*RawDataCBType)(RawData&, void*); // typedef the member function pointer type
RawDataCBType pmf = &CETAPI::RawDataCB; // create and initialize a pointer to the member function
pCETAPIObject->*pmf(r, userData); // call the member function on an object of type CETAPI

Вот хорошая статья, которая говорит о членских указателях.

0

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

В этом случае компилятор находит проблему в синтаксисе
используйте следующую строку кода

pIEtApi-> SetRawDataCB ((длинный) (_int64) (&CETAPI :: RawDataCB), 0,&результат);

см. ссылку для получения дополнительной информации Описание кода ошибки

0

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