首页 > 解决方案 > 你如何在静态函数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:非静态成员函数的非法调用

我应该如何解决这个问题?

标签: c++

解决方案


在这种情况下,您有两种选择,假设它m_ctlDisplay是 FirmwareUi 的成员函数:

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

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


推荐阅读