首頁 > 後端開發 > C++ > 如何將 C 類別成員函數作為回調傳遞?

如何將 C 類別成員函數作為回調傳遞?

Linda Hamilton
發布: 2025-01-02 16:37:40
原創
598 人瀏覽過

How Can I Pass a C   Class Member Function as a Callback?

將類別成員函數作為回調傳遞

當使用需要函數指標作為回呼的API 時,嘗試傳遞時可能會出現困難來自類別本身的類別成員函數。本文探討了這個問題的複雜性,並提供了有效解決此問題的解決方案。

問題陳述

考慮一個假設的類 CLoggersInfra,它包含一個成員函數 RedundancyManagerCallBack 。您試圖在另一個API 函數Init 中使用此成員函數作為回調,但遇到以下編譯錯誤:

Error  8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
登入後複製

深入研究問題

The錯誤來源於C 中成員函數的基本特徵。雖然它們看起來只屬於特定的類別實例,但它們本質上會接收一個額外的隱藏參數,該參數是對類別實例本身的引用。這通常稱為“this”指針。

解決方案解釋

1.使用Boost

Boost,一個第三方庫,提供了一個強大的工具來解決這個問題:boost::bind。它允許您建立一個“鎖定”特定參數的新函數。在這種情況下,隱藏的「this」參數可以鎖定到特定的類別實例,從而有效地建立一個只有一個可見參數的新函數。

2.使用自訂物件包裝

或者,您可以建立一個自訂對象,該物件接受對類別實例的引用,並提供一個“run”或“execute”方法,該方法使用提供的參數來呼叫成員函數。但是,這種方法需要修改 API 以接受自訂物件而不是原始函數指標。

3. C 11 Lambda 函數

在 C 11 及更高版本中,lambda 函數提供了更優雅的解決方案。它們可以捕獲“this”指針,從而無需單獨的自訂物件。 Lambda 函數提供了一種簡潔且方便的方法來實現所需的功能。

結論

理解成員函數的內在本質及其隱藏的「this」參數對於成功地將它們作為回調傳遞。透過利用 boost::bind 或 C 11 lambda 函數的功能,您可以有效解決編譯錯誤並順利地將類別成員函數用作回調函數。

以上是如何將 C 類別成員函數作為回調傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板