如何在C ++中将void函数传递给void指针

问题描述 投票:-1回答:1

这是我的问题:我有一个tact类,用于嵌入式应用程序中的触觉按钮。

我添加了setFunctions()函数,以便可以将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中为所需的每个处理实例创建3个唯一的函数,并使用setFunctions()成员将它们链接到处理实例。

这是setFunctions成员的工作方式(或应该这样)。它将3个唯一的函数链接到3个void指针,它们是private下的tact类的一部分:

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;
}

然后,指针用于从激活成员访问功能(一个简单的开关盒,用于查看轻触按钮当前处于哪种状态:]

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()不允许我将void函数链接到我的void函数指针上?

谢谢!

c++ function pointers void
1个回答
0
投票

行:

upPin.setFunctions(up_short(), up_release(), up_long())

分别单独调用功能up_short()up_release()up_long()。这些函数返回void,然后将其传递给setFunctions中的每个参数-这就是为什么您遇到3次此错误的原因。

您要做的是将函数本身(指向)传递给setFunctions

如果将行更改为:

upPin.setFunctions(up_short, up_release, up_long);

您应该看到此工作

© www.soinside.com 2019 - 2024. All rights reserved.