簡體   English   中英

將C ++成員函數映射到C回調

[英]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);
};

接收回調的函數只能是:

  1. 普通功能
  2. 靜態功能

為什么不能成為成員類函數?

這都是關於指針的。 指向普通函數或靜態函數的指針是存儲器的地址。 指向成員類函數的指針是一個偏移量-應該添加到對象指針(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.

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