c++ - 你如何在静态函数c ++中使用成员函数
问题描述
来自外部 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:非静态成员函数的非法调用
我应该如何解决这个问题?
解决方案
在这种情况下,您有两种选择,假设它m_ctlDisplay
是 FirmwareUi 的成员函数:
- 您使 UpdateGui 成为非静态成员函数。在这种情况下,
this
隐式传递给常规成员函数(但不是静态成员函数)的实例指针可用并且该函数可以访问m_ctlDisplay
. - 如果无法转换
UpdateGui
为常规的非静态成员函数,则需要扩展函数签名并传入指向FirmwareGui
您的代码需要引用的实例的指针以访问该m_ctlDisplay
实例。
这表明存在类设计问题,因为它表明UpdateGui
确实应该/需要是非静态的实例成员函数,而不是静态(类)成员函数。
推荐阅读
- python - Python:将 xml 文件转换为图像
- python - @pytest.mark.filterwarnings 是如何工作的?
- c - 我是否需要释放从函数接收动态分配对象的指针?
- c# - 如何以编程方式在 Visual Studio C# 的面板中添加 onClick?
- javascript - 使用 Javascript 和 Framework7 获取单击事件的 href 属性
- python-3.x - groupby sum() 没有加起来,但显示出奇怪的结果
- apache - 从不同路径加载资产
- c# - python中c#的task.delay有什么相似之处?
- adsense - 是否可以通过 API 从 AdSense 添加/删除网站?
- angular - 由于 xmlrpc npm 包,运行 ng build --prod 时出现错误“无法解析 http ...”?