2010-10-01 82 views
2

我还不是很熟悉这些,但也许有人可以照亮这个例子。使用函数指针?

想象一下,我有CFoo类,它将有一个函数来添加一个处理函数和一个函数指针函数。

因此,像这样:

class CFoo { 

int *pointedFunc(int a, int b) = 0; 

void setFunc(int *func(int a, int b)) 
{ 
    pointedFunc = func; 
} 
}; 

鉴于上述背景下,我想知道这样做的正确方法。我认为我没有做好。另外,我将如何去调用pointedFunc?

感谢

+1

不是作为函数指针的“a *函数*”,而是作为函数指针的“a *成员变量*(在OO中称为a *字段*)”。 – 2010-10-01 00:39:45

+0

请避免使用C++代码中的函数指针。定义一个接口并创建实现该接口的类型。然后您可以整齐地存储对象,而不必诉诸函数指针的C hocks-pockus。 – 2010-10-01 01:04:00

+0

@Martin:有时一个接口是正确的方法,有时候模板化(和鸭子类型)仿函数,有时函数指针是最好的。特别是对于动态链接,需要函数指针。 – 2010-10-01 05:20:41

回答

8

现在你有一个成员函数返回int *,而不是返回int函数的指针。一组括号可以解决这个问题。

int (*pointedFunc)(int a, int b); 

void setFunc(int (*pfunc)(int a, int b)) 
{ 
    pointedFunc = pfunc; 
} 

此外,成员变量初始化得到在构造函数中构造函数初始化程序列表,像

CFoo::CFoo() : pointedFunc(0) {} 

不喜欢你做。你的= 0实际上是一个纯粹的说明符(除非成员函数是虚拟的,否则它是行不通的),当你修正指针返回类型与指向函数的问题时,你会发现编译器也会抱怨你尝试初始化它。

Using a typedef as Graeme suggests是跟踪函数指针类型的最简单也是最好的方法。

+0

噢,谢谢,我不知道它只是用于虚函数 – jmasterx 2010-10-01 00:39:09

+0

它不仅仅是用于虚拟函数,因为'= 0'意思是**完全不同的**(提示Monty Python),当它出现在函数声明,就像它出现在数据声明中一样。实际上,'int(* poinFunc)(int a,int b)= 0;'完全可以作为局部变量,它可以被初始化,但是成员变量会在构造函数中初始化,而不是在声明中初始化。 – 2010-10-01 00:42:10

+0

虽然你肯定设置一个函数本身= 0是一个纯粹的说明符,但我觉得你可以设置一个函数*指针*为NULL而不会出现问题,我相信这是最初的意图。 – Bryan 2010-10-01 00:45:04

3

在你的榜样,pointedFunc是一个成员函数返回一个int *。为了使一个函数指针,你需要大约pointedFunc括号,如:

int (*pointedFunc)(int a, int b); 

一个类型定义可能更清楚:

class CFoo { 
    CFoo() : pointedFunc(NULL) {} 
    typedef int (*funcType)(int, int); 
    funcType pointedFunc; 

    void setFunc(funcType f) { 
     pointedFunc = f; 
    } 
}; 

调用的函数,你可以使用pointedFunc(1, 2)(*pointedFunc)(1, 2)。我倾向于使用后者来说明你正在经历一个函数指针,但是两者都可以工作。

+2

不,这不好,现在他有一个名为'pointedFunc'的成员函数,返回类型是'int *'。 – 2010-10-01 00:34:15

+0

好吧,谢谢,我想我缺乏自信:p – jmasterx 2010-10-01 00:35:41

+0

@Ben:你是对的 - 感谢您的澄清。我已经解决了我的答案。 – 2010-10-01 00:38:26