【问题标题】:how to pass a void function to a void pointer in C++如何在 C++ 中将 void 函数传递给 void 指针
【发布时间】:2020-02-12 21:20:54
【问题描述】:

这是我的问题: 我有我的 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 中为我需要的每个 tact 实例创建 3 个独特的函数,并使用 setFunctions() 成员将它们链接到 tact 实例。

这就是 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;
}

然后,指针用于访问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() 不允许我将 void 函数链接到我的 void 函数指针???

谢谢!

【问题讨论】:

  • 当您尝试传递时,您正在调用函数,例如“up_long()”,它返回void,从而给出这个错误。您想要的是传递(指向)函数本身。从函数中删除大括号,这样你就可以传递up_short, up_release, up_long
  • 你需要重新考虑你的设计。

标签: c++ function pointers void


【解决方案1】:

行:

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

你应该看到这个作品

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2018-08-27
    • 2012-10-06
    • 1970-01-01
    • 2012-11-08
    • 2018-08-25
    相关资源
    最近更新 更多