【问题标题】:Function pointer as parameter函数指针作为参数
【发布时间】:2011-02-04 15:30:29
【问题描述】:

我尝试调用一个没有参数的作为函数指针传递的函数,但我无法让它工作。

void *disconnectFunc;

void D::setDisconnectFunc(void (*func)){
    disconnectFunc = func;
}

void D::disconnected(){
    *disconnectFunc;
    connected = false;
}

【问题讨论】:

  • cdecl.org 可以提供帮助。
  • @JRL cdecl 对此没有特别的帮助(我在谷歌搜索这个问题之前尝试了 cdecl)。

标签: c++ function pointers function-pointers


【解决方案1】:

void *disconnectFunc; 替换为void (*disconnectFunc)(); 以声明函数指针类型变量。或者更好地使用typedef

typedef void (*func_t)(); // pointer to function with no args and void return
...
func_t fptr; // variable of pointer to function
...
void D::setDisconnectFunc( func_t func )
{
    fptr = func;
}

void D::disconnected()
{
    fptr();
    connected = false;
}

【讨论】:

    【解决方案2】:

    正确的做法是:

    typedef void (*callback_function)(void); // type for conciseness
    
    callback_function disconnectFunc; // variable to store function pointer type
    
    void D::setDisconnectFunc(callback_function pFunc)
    {
        disconnectFunc = pFunc; // store
    }
    
    void D::disconnected()
    {
        disconnectFunc(); // call
        connected = false;
    }
    

    【讨论】:

    • +1 用于使用我首选的取消引用函数指针的语法(更喜欢 disconnectFunc() 到 (*disconnectFunc)(),即使它们都很好)
    • 这种便携方式还是不推荐用于便携?
    • @JavaRunner:非常便携。
    • 很好。谢谢!如果我需要使用一些参数将函数传递给 setDisconnectFunc(),您是否知道我需要在该代码中修复什么?
    • @JavaRunner:如果你需要帮助扩展它,你应该问一个新问题,评论部分太受限制了。有很多方法可以做到这一点,无论您的要求是什么。
    【解决方案3】:

    您需要将 disconnectFunc 声明为函数指针,而不是 void 指针。您还需要将其作为函数调用(带括号),并且不需要“*”。

    【讨论】:

    • 谢谢。最终代码: void (*disconnectFunc)(); void D::setDisconnectFunc(void (*func)()){ disconnectFunc = func; } void D::disconnected(){ (*disconnectFunc)();连接=假; }
    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2012-03-07
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多