我不是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'
非常感谢任何帮助。
答案 0 :(得分:2)
这里有两个问题。
首先,函数指针不能指向成员函数,因为成员函数需要this
指针才能运行。您必须使成员函数static
,或使指针成为成员函数指针。
其次,函数指针和函数必须使用相同的调用约定。指针使用CALLBACK
,其定义为__stdcall
。
这是一个修订过的功能:
static HRESULT CALLBACK CreateFn(IXRDependencyObject *pExistingXRDO,
UINT objectId)
{
return S_OK;
}
答案 1 :(得分:0)
您必须传递普通函数,而不是成员函数(函数是类的字段)。它们是不同的对象,事实上,该方法采用隐藏的附加参数,这显然是指向this
(调用该方法的对象)的指针。如果要将回调定义包含在类中,请将其设置为静态方法。
答案 2 :(得分:0)
成员函数需要调用一个你没有传递的对象,而你想要的是一个正常的函数。
在类中使用静态方法,而不需要将对象指针传递给它。