2012-04-24 143 views
1

我想将一个回调函数转发给函数指针。所以,我宣布一个静态(INT *)m_pointer1,还有一种方法无效RegisterCallback1((INT *)FCT)C++调用静态函数指针

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

回答

6

你还没有声明函数指针,你声明了一个正常的数据指针。您在声明结尾缺少()。

+0

这是伟大的,所有,但那么我怎么用参数调用registerCallback1函数? class1.RegisterCallBack1(??? - class2 :: callback - ???); – 2012-04-24 19:45:30

+0

@David:假设'class2 :: callback'是'static','c1.RegisterCallBack1(&class2 :: callback)'。 – ildjarn 2012-04-24 19:48:35

+0

这给出了另一个错误:void(__stdcall *)()的参数与void(*)()类型的参数不兼容。如果我添加__stdcall函数指针decleration,我得到链接错误,说m_callback1()不能在class1(不是class2)中找到 – 2012-04-24 19:54:27

7

static int (*m_Callback1)不会减少函数指针,只是指向int的指针:您忘记了参数列表。您的意思是:

static int (*m_Callback1)(); 

int RegisterCallback1(int (*fct)()); 
+0

多数民众赞成在很好,但然后如何将它传递给RegisterCallback1?我尝试了一些像class1.RegisterCallback1((int *)class2 :: callback);和许多组合,他们似乎都给我一个错误?总是与int *类型的参数不兼容(int *)() – 2012-04-24 19:25:16

1

你可以尽量限制使用的typedef回调函数的签名失踪()错误的奥利和戴夫指出:typedef int (*)() CallBack;这至少有让您一次考虑括号的精确数量而不是使用此类函数的代码中的每一点的优点。