克服將類別成員函數作為回調傳遞時的編譯錯誤
由於誤解,在將類別成員函數作為回調傳遞時遇到編譯錯誤關於語法和成員中隱藏的“this”參數函數。
澄清成員函數
成員函數不是獨立函數,而是帶有附加隱藏「this」指標的函數。此指標引用該函數所屬類別的實例。當使用類別實例語法(例如 object.memberFunction())呼叫成員函數時,編譯器會自動決定「this」的值。
語法難題
您最初的方法失敗了,因為您嘗試將 &CLoggersInfra::RedundencyManagerCallBack 作為回調傳遞。此函數指標缺少必要的“this”指標。正確的語法是:
m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));
揭開隱藏的「this」
您想要傳遞特定於 CLoggersInfra 類別的特定實例的回調。為了解決隱藏的“this”指針,您需要明確綁定它。
std::bind1st 和boost::bind 救援
使用std::bind1st或boost::bind 綁定「this」指針,建立一個新函數,此函數將實例作為隱藏參數,並照常使用回呼的原始參數。這解決了編譯問題。
隱藏的陷阱
Init 需要一個原始函數指針,而 boost::bind 不提供開箱即用的功能。不過,StackOverflow 提供了一個將 boost::functions 轉換為原始指標的解決方案。
使用 Lambda 函數更新 C 11
在 C 11 及更高版本中,捕獲的 lambda 函數為此,「this」可以取代 boost::bind。
以上是如何在 C 中正確傳遞類別成員函數作為回調?的詳細內容。更多資訊請關注PHP中文網其他相關文章!