如何在静态函数 c++ 中使用成员函数

How do you use a member function inside a static function c++

本文关键字:成员 函数 c++ 静态函数      更新时间:2023-10-16
来自

外部 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 固件 UI:非法调用非静态成员函数

我应该如何处理这个问题?

您可以定义自己的用户数据结构,其中包含文本和对类实例的引用。
在回调中,您将输入参数强制转换为结构并提取文本和实例。

在这种情况下,

你有两个选择,假设m_ctlDisplay是固件UI的成员函数:

  • 你使 UpdateGui 成为一个非静态成员函数。在这种情况下,隐式传递给常规成员函数(但不是静态成员函数(的 this 实例指针可用,并且该函数可以访问 m_ctlDisplay
  • 如果无法将UpdateGui转换为常规的非静态成员函数,则需要扩展函数签名,并将指针传递到代码需要引用的FirmwareGui实例,以便访问m_ctlDisplay实例。

这表明存在类设计问题,因为它表明UpdateGui实际上应该/需要是一个非静态的实例成员函数,而不是静态(类(成员函数。