C ++函数指针和回调函数

时间:2012-01-19 17:03:18

标签: c++ visual-c++

我不是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 个答案:

答案 0 :(得分:2)

这里有两个问题。

首先,函数指针不能指向成员函数,因为成员函数需要this指针才能运行。您必须使成员函数static,或使指针成为成员函数指针。

其次,函数指针和函数必须使用相同的调用约定。指针使用CALLBACK,其定义为__stdcall

这是一个修订过的功能:

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

答案 1 :(得分:0)

您必须传递普通函数,而不是成员函数(函数是类的字段)。它们是不同的对象,事实上,该方法采用隐藏的附加参数,这显然是指向this(调用该方法的对象)的指针。如果要将回调定义包含在类中,请将其设置为静态方法。

答案 2 :(得分:0)

成员函数需要调用一个你没有传递的对象,而你想要的是一个正常的函数。

在类中使用静态方法,而不需要将对象指针传递给它。