Указатели на функции C ++ и функции обратного вызова - PullRequest
2 голосов
/ 19 января 2012

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

typedef HRESULT (CALLBACK *PFN_CREATE_XAMLOBJECT)(
    IXRDependencyObject *pExistingXRDO,
    UINT objectId
);

Метод, который я пытаюсь передать, тоже определяется следующим образом (все остальные параметры удалены)

virtual HRESULT STDMETHODCALLTYPE RegisterXamlObject(
    __in    PFN_CREATE_XAMLOBJECT   pfXamlObjectCreation,
) = 0;

Функция, которую я определил для передачи, выглядит следующим образом

HRESULT CreateFn(__in IXRDependencyObject *pExistingXRDO, UINT objectId)
{
    return S_OK;
}

Я пытаюсь передать указатель функции следующим образом.

&MyClass::CreateFn

Я получаю следующую ошибку

Error   3   error C2440: 'type cast' : cannot convert from 'HRESULT (__cdecl MyClass::* )(IXRDependencyObject *,UINT)' to 'PFN_CREATE_XAMLOBJECT'

Любая помощь будет высоко ценится.

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Здесь две проблемы.

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

Во-вторых, указатель функции и функция должны использовать одно и то же соглашение о вызовах.Указатель использует CALLBACK, который определен как __stdcall.

Вот пересмотренная функция:

static HRESULT CALLBACK CreateFn(IXRDependencyObject *pExistingXRDO,
                                 UINT objectId)
{
    return S_OK;
}
0 голосов
/ 19 января 2012

Функция-член нуждается в вызове объекта, который вы не передаете, в то время как вам нужна обычная функция.

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

0 голосов
/ 19 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...