外部C库的回调函数需要
void ds30_set_event_callback(void(*)(const ds30_event_t, const boolean, const void* const));
在调用控制台时,我可以将内容输出到控制台,但是当前无法编译代码。我在下面的示例问题上遇到了麻烦。
我无法将参考对象传递给回调,也无法更改回调处理程序的签名。如何使静态函数知道成员函数,或者如何使静态函数知道类实例?
/*static*/ void FirmwareUi::ds30_event_handler(const ds30_event_t event, const boolean success, const void* const data)
{
if (event == DEBUG_INFO)
{
auto text = data;
LPSTR output = LPSTR(text);
OutputDebugStringA(output);
UpdateGui(output);
}
}//ds30_event_handler()
void FirmwareUi::UpdateGui(LPCSTR data)
{
m_ctlDisplay->AppendText(data);
}
我遇到的错误是错误C2352 FirmwareUi:非法调用非静态成员函数
我应该如何解决这个问题?
答案 0 :(得分:1)
您可以定义自己的用户数据结构,该结构同时包含文本和对类实例的引用。
在回调中,将输入参数强制转换为结构,然后提取文本和实例。
答案 1 :(得分:1)
在这种情况下,假设m_ctlDisplay
是FirmwareUi的成员函数,您有两种选择:
this
实例指针,该实例指针隐式传递给常规成员函数(但不是静态成员),并且该函数可以访问m_ctlDisplay
。UpdateGui
转换为常规的非静态成员函数,则需要扩展函数签名并传递指向代码需要的FirmwareGui
实例的指针来获得对m_ctlDisplay
实例的访问权限。这表明类设计存在问题,因为它表明UpdateGui
实际上应该/需要是一个非静态的实例成员函数,而不是一个静态(类)成员函数。