在C ++项目中,我使用C库来访问某些硬件。 C-Binding包括回调以通知某些输入引脚的更改。
回调函数如下所示:
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
函数静态能够将函数分配给回调的最简洁方法是什么?
答案 0 :(得分:6)
使用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 :(得分:0)
接收回调的功能只能是:
为什么它不能成为成员类函数?
这都是关于指针的。指向普通函数或静态函数的指针是存储器的地址。 指向成员类函数的指针是一个偏移量 - 应该添加到对象指针(this)以访问该方法。 [参见 jv110 注释]
在C ++中,成员函数有一个指向的隐式参数 对象(成员函数内的this指针)。正常C. 函数可以被认为具有不同的调用约定 从成员函数,所以他们的指针类型 (指向成员函数的指针与指向函数的指针)是不同的 不相容。 C ++引入了一种新类型的指针,称为a 指向成员的指针,只能通过提供对象来调用。 https://isocpp.org/wiki/faq/pointers-to-members#addr-of-memfn
您可以在回调中使用user_data来访问类成员方法,如user1320881所说。