如何在 C++ 中将 void 函数传递给 void 指针
how to pass a void function to a void pointer in C++
这是我的问题:
我有我的 tact class,用于嵌入式应用程序中的触觉按钮。
我添加了 setFunctions() 函数,这样我就可以 link 3 个函数到我创建的每个 tact 实例(处理短按钮按下、释放和长按)。
class tact
{
public:
tact(int assigned_pin, input_shift_register shift = {0,0,0}); // Constructor
void debounce();
short poll(bool debounce_flag);
void activate();
void setFunctions(void short_press_function(void), void release_press_function(void), void long_press_function(void));
short state;
private:
int pin;
void (*short_ptr)(void);
void (*release_ptr)(void);
void (*long_ptr)(void);
}
因此,我可以在 main 中为我需要的每个 tact 实例创建 3 个独特的函数,并 link 使用 setFunctions() 成员将它们添加到 tact 实例。
这就是 setFunctions 成员的工作方式(或应该)。它 link 是 3 个 void 指针的 3 个独特函数,它们是 private 下的 tact class 的一部分:
void tact::setFunctions(void short_press_function(), void release_press_function(), void long_press_function())
{
short_ptr = short_press_function;
release_ptr = release_press_function;
long_ptr = long_press_function;
}
然后,指针用于访问来自 activate 成员的函数(一个简单的 switch case,用于查看轻触按钮当前处于哪个状态):
void tact::activate()
{
switch (tact::state)
{
case SHORT_EFFECT_REQUIRED:
short_ptr();
break;
case RELEASE_EFFECT_REQUIRED:
release_ptr();
break;
case LONG_EFFECT_REQUIRED:
long_ptr();
break;
default:
break;
}
tact::state = 0;
}
总的来说,我打算这样做:
void up_short()
{
}
void up_release()
{
}
void up_long()
{
}
tact upPin(2);
void setup()
{
upPin.setFunctions(up_short(), up_release(), up_long()); //ERRORS ARE HERE!!
}
void loop()
{
//use the tact buttons in my applications!
upPin.poll(DEBOUNCED); // Updates upPin.state
if(upPin.state) //if not 0, either pressed, released, or pressed long enough
upPin.activate();
}
但是 setFunctions() 提到同一个错误 3 次:
argument of type "void" is incompatible with parameter of type "void (*)()"
我作为参数传递给 setFunctions() 的 3 个函数中的每一个都有一个错误
所以我的问题是我做错了什么?我真的很喜欢我如何简单地使用 upPin.activate 来实现我的功能,而正确的功能是自动完成的。我不明白为什么 setFunctions() 不允许我 link void 函数到我的 void 函数指点???
谢谢!
行:
upPin.setFunctions(up_short(), up_release(), up_long())
正在分别调用函数 up_short()
、up_release()
和 up_long()
。这些函数 return void
,然后传递给 setFunctions
中的每个参数——这就是为什么您遇到此错误 3 次。
您要做的是将函数本身传递(指向)到 setFunctions
如果将行更改为:
upPin.setFunctions(up_short, up_release, up_long);
你应该看看这个作品
这是我的问题: 我有我的 tact class,用于嵌入式应用程序中的触觉按钮。
我添加了 setFunctions() 函数,这样我就可以 link 3 个函数到我创建的每个 tact 实例(处理短按钮按下、释放和长按)。
class tact
{
public:
tact(int assigned_pin, input_shift_register shift = {0,0,0}); // Constructor
void debounce();
short poll(bool debounce_flag);
void activate();
void setFunctions(void short_press_function(void), void release_press_function(void), void long_press_function(void));
short state;
private:
int pin;
void (*short_ptr)(void);
void (*release_ptr)(void);
void (*long_ptr)(void);
}
因此,我可以在 main 中为我需要的每个 tact 实例创建 3 个独特的函数,并 link 使用 setFunctions() 成员将它们添加到 tact 实例。
这就是 setFunctions 成员的工作方式(或应该)。它 link 是 3 个 void 指针的 3 个独特函数,它们是 private 下的 tact class 的一部分:
void tact::setFunctions(void short_press_function(), void release_press_function(), void long_press_function())
{
short_ptr = short_press_function;
release_ptr = release_press_function;
long_ptr = long_press_function;
}
然后,指针用于访问来自 activate 成员的函数(一个简单的 switch case,用于查看轻触按钮当前处于哪个状态):
void tact::activate()
{
switch (tact::state)
{
case SHORT_EFFECT_REQUIRED:
short_ptr();
break;
case RELEASE_EFFECT_REQUIRED:
release_ptr();
break;
case LONG_EFFECT_REQUIRED:
long_ptr();
break;
default:
break;
}
tact::state = 0;
}
总的来说,我打算这样做:
void up_short()
{
}
void up_release()
{
}
void up_long()
{
}
tact upPin(2);
void setup()
{
upPin.setFunctions(up_short(), up_release(), up_long()); //ERRORS ARE HERE!!
}
void loop()
{
//use the tact buttons in my applications!
upPin.poll(DEBOUNCED); // Updates upPin.state
if(upPin.state) //if not 0, either pressed, released, or pressed long enough
upPin.activate();
}
但是 setFunctions() 提到同一个错误 3 次:
argument of type "void" is incompatible with parameter of type "void (*)()"
我作为参数传递给 setFunctions() 的 3 个函数中的每一个都有一个错误
所以我的问题是我做错了什么?我真的很喜欢我如何简单地使用 upPin.activate 来实现我的功能,而正确的功能是自动完成的。我不明白为什么 setFunctions() 不允许我 link void 函数到我的 void 函数指点???
谢谢!
行:
upPin.setFunctions(up_short(), up_release(), up_long())
正在分别调用函数 up_short()
、up_release()
和 up_long()
。这些函数 return void
,然后传递给 setFunctions
中的每个参数——这就是为什么您遇到此错误 3 次。
您要做的是将函数本身传递(指向)到 setFunctions
如果将行更改为:
upPin.setFunctions(up_short, up_release, up_long);
你应该看看这个作品