【问题标题】:C++ calling static function pointerC++调用静态函数指针
【发布时间】:2012-05-05 11:31:56
【问题描述】:

我想将回调转发给函数指针。所以我声明了一个静态(int*)m_pointer1,以及一个方法void RegisterCallback1((int*)fct)

在class1.h中:

public:
   int RegisterCallback1( int (*fct) );
private:
   static int (*m_Callback1);

在class1.cpp中:

int class1::RegisterCallback1( int (*fct) )
{
    m_Callback1= fct;
}

然后,我想将回调转发到函数指针:

void class1::Callback1()
{
   (*m_Callback1)();
}

但我得到一个编译器错误“表达式必须具有(指向)-函数类型 我已经按照教程阅读并阅读了函数指针,他们似乎这样做没有任何问题。任何想法为什么?

编辑: 所以,我声明 (int*)(void)m_Callback1 -Visual Studio 需要一个 void...- 那么如何调用带有参数的 registerCallback 函数呢?

class1.RegisterCallBack1(  ??? - class2::callback -??? );

【问题讨论】:

    标签: c++ pointers static function-pointers


    【解决方案1】:

    static int (*m_Callback1) 没有声明一个函数指针,只是一个指向 int 的指针:你忘记了参数列表。你的意思是:

    static int (*m_Callback1)();
    

    int RegisterCallback1( int (*fct)() );
    

    【讨论】:

    • 这很好,但是我如何将它传递给 RegisterCallback1?我尝试了类似 class1.RegisterCallback1( (int*) class2::callback );和许多组合,它们似乎都给我一个错误?总是带有 int* 类型参数的东西与 (int*)() 不兼容
    【解决方案2】:

    你还没有声明一个函数指针,你已经声明了一个普通的数据指针。您在声明末尾缺少 () 。

    【讨论】:

    • 这很好,但是我如何调用带有参数的 registerCallback1 函数呢? class1.RegisterCallBack1( ??? - class2::callback -??? );
    • @David :假设class2::callbackstaticc1.RegisterCallBack1(&class2::callback)
    • 这给出了另一个错误:void(__stdcall )() 类型的参数与 void()() 类型的参数不兼容。如果我将 __stdcall 添加到函数指针 decleration,我会收到链接错误,说在 class1(不是 class2)中找不到 m_callback1()
    【解决方案3】:

    您可以尝试通过使用 typedef 作为回调函数的签名来限制 Oli 和 Dave 指出的缺失 () 错误:typedef int (*)() CallBack; 这至少具有让您考虑括号的精确数量的优点而不是在代码中使用此类函数的每个点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2011-12-22
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多