簡體   English   中英

如何在靜態函數c ++中使用成員函數

[英]How do you use a member function inside a static function 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確實應該是/需要是非靜態的實例成員函數而不是靜態(類)成員函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM