[英]Map C++ member function to C callback
在C ++項目中,我使用C庫訪問某些硬件。 C綁定包括回調,用於通知某些輸入引腳上的更改。 回調函數如下所示: void callback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
在我的實現中,我有一個SensorController
類,該類具有一個應接收回調的成員函數。 成員函數如下所示: void SensorController::pinChanged(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
。
現在我想知道,什么是避免將pinChanged
函數pinChanged
靜態函數以便能夠將函數分配給回調的最干凈的方法?
使用user_data
指針可以為您提供一個指向擁有回調的類的指針。 例如。
void MyCallback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
{
static_cast<Example *>(user_data)->Callback(port, interrupt_mask, value_mask);
}
class Example
{
public:
Example()
{
//setup callback here - i dont know what library you're using but you should be able to pass a this pointer as user_data
init_lib(fictionalparameter1, fictionalparameter2, this);
}
private:
void Callback(char port, uint8_t interrupt_mask, uint8_t value_mask)
{
//callback handler here...
}
friend void MyCallback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data);
};
接收回調的函數只能是:
為什么不能成為成員類函數?
這都是關於指針的。 指向普通函數或靜態函數的指針是存儲器的地址。
指向成員類函數的指針是一個偏移量-應該添加到對象指針(this)以訪問該方法的數字。
[請參閱jv110評論]
在C ++中,成員函數具有指向對象的隱式參數(成員函數內部的this指針)。 普通C函數可以被認為與成員函數具有不同的調用約定,因此其指針的類型(指針到成員函數與指針到函數)是不同且不兼容的。 C ++引入了一種新型的指針,稱為成員指針,只有提供一個對象才能調用它。 https://isocpp.org/wiki/faq/pointers-to-members#addr-of-memfn
您可以在回調中使用user_data來訪問類成員方法,如user1320881所示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.