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

时间:2019-04-01 12:00:34

标签: 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:非法调用非静态成员函数

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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