通过引用传递函数指针
嗨,我想在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
注意编译:我想在其他一些代码来使用这些预处理器标志和函数指针别处。 请让我知道这样的事情是一个好主意/实践。
使用typedef
:
typedef void (*MyFunctionPointer)(int,int);
void functionsetter(MyFunctionPointer& fp);
我想一些其他的代码使用这些预处理器标志和函数指针别处。请让我知道这样的事情是不是一个好主意/实践。
不,不是真的。从你的例子中不清楚你想要完成什么,但是你的实现很不寻常。考虑使用虚拟成员函数或std::function
在运行时切换函数实现,或者(可能)使用模板在编译时切换它们。使用条件编译进行静态选择没有任何问题,但将它与函数指针混合有点奇怪。
没有很好地理解你要解决的问题,很难就如何最好地解决问题给出好的建议。
你会签名改为:
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
}
首先,你不能传递一个函数指针参考的方法,你只是传递一个函数指针。您需要将方法签名更改为
void functionsetter(void (*&ptr2fun)(int,int) )
而且,你的方法签名是在一些地方void(*)(int,int)
和int(*)(int,int)
一些,他们也许应该是无处不在后者,因为您的加载和繁殖方法返回int
。这就是说,由于您使用的是C++,因此我不推荐使用这种方式来操作指针,C++具有继承/虚拟方法,通常可以取代大多数函数指针的使用,并使代码更具可读性,可扩展性。
,不使用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) { ... }