![](/img/trans.png)
[英]how to use a pointer to member function inside a static member function in 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的成員函數,在這種情況下你有兩個選擇:
this
實例指針,並且該函數可以訪問m_ctlDisplay
。 UpdateGui
轉換為常規的非靜態成員函數,則需要擴展函數簽名並傳入指向您的代碼需要引用的FirmwareGui
實例的指針,以獲取對m_ctlDisplay
實例的訪問權限。 這表明類設計問題,因為它表明UpdateGui
確實應該是/需要是非靜態的實例成員函數而不是靜態(類)成員函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.