2012-03-09 226 views
1

嗨,我想在C/C++中学习一些函数指针,并试图在Ubuntu上使用gcc编写下面的C++代码。通过引用传递函数指针

此代码应执行编译

#include <iostream> 
#include <iomanip> 
//Adds two numbers 
int add(int a, int b) 
{ 
    return a+b; 
} 
//Multiplies two numbers 
int multiply(int a, int b) 
{ 
    return a*b; 
} 

//Function to set the correct function to be executed. 
//All functions here should have the same signature. 
void functionsetter(void (*ptr2fun)(int,int) ) 
{ 
#ifdef ADD 
    ptr2fun = add; 
#endif 

#ifdef MULTIPLY 
    ptr2fun = multiply 
#endif 
} 

int main(int argc, char *argv[]) 
{ 
    int a = 5; 
    int b = 6; 

    void (*foo)(int,int); 
    functionsetter(foo); 

    return 0; 
} 

期间提供的乘法或或取决于 预处理标志add函数-DADD或-DMULTIPLY我无法弄清楚如何函数指针foo传递给function-setter功能通过参考。有人可以帮我解决这个问题。我确信

functionsetter是错误的代码,请让我知道如何解决它。

我试图用g++ -O2 -g -Wall -DADD main.cpp -o main

注意编译:我想在其他一些代码来使用这些预处理器标志和函数指针别处。 请让我知道这样的事情是一个好主意/实践。

回答

5

使用typedef

typedef void (*MyFunctionPointer)(int,int); 
void functionsetter(MyFunctionPointer& fp); 

我想一些其他的代码使用这些预处理器标志和函数指针别处。请让我知道这样的事情是不是一个好主意/实践。

不,不是真的。从你的例子中不清楚你想要完成什么,但是你的实现很不寻常。考虑使用虚拟成员函数或std::function在运行时切换函数实现,或者(可能)使用模板在编译时切换它们。使用条件编译进行静态选择没有任何问题,但将它与函数指针混合有点奇怪。

没有很好地理解你要解决的问题,很难就如何最好地解决问题给出好的建议。

1

你会签名改为:

void functionsetter(void (*&ptr2fun)(int,int) ) 

注意,ptr2fun函数指针的签名错误,你的增加和乘函数返回一个int,所以必须ptr2fun

这将成为一个很容易,如果你使用typedef:

typedef int (*ptr2fun)(int,int); 
void functionsetter(ptr2fun& func) { ... 

虽然,个人我只是返回函数指针。

ptr2fun functionsetter() 
{ 
#ifdef ADD 
    return add; 
#endif 

#ifdef MULTIPLY 
    return multiply 
#endif 
} 
1

首先,你不能传递一个函数指针参考的方法,你只是传递一个函数指针。您需要将方法签名更改为

void functionsetter(void (*&ptr2fun)(int,int) ) 

而且,你的方法签名是在一些地方void(*)(int,int)int(*)(int,int)一些,他们也许应该是无处不在后者,因为您的加载和繁殖方法返回int。这就是说,由于您使用的是C++,因此我不推荐使用这种方式来操作指针,C++具有继承/虚拟方法,通常可以取代大多数函数指针的使用,并使代码更具可读性,可扩展性。

9

,不使用typedef,对于一个函数指针引用的语法是:

void functionsetter(void (*&ptr2fun)(int, int)) { ... } 

但一般简单的创建指针类型typedef

typedef void (*FunctionPointer)(int, int); 

void functionsetter(FunctionPointer& ptr2fun) { ... } 

或为功能类型:

typedef void Function(int, int); 

void functionsetter(Function*& ptr2fun) { ... }