我在问一些具体问题。
对于问题2,这就是我的意思:
void s(void) {
//...
}
void f(function) { // what should I put as type to pass a function as an argument
//...
}
f(s);
答案 0 :(得分:24)
要定义函数指针,请使用以下语法:
return_type (*ref_name) (type args, ...)
因此,要定义名为“doSomething”的函数引用,它返回int
并接受int
参数,您可以这样写:
int (*doSomething)(int number);
然后您可以将引用分配给这样的实际函数:
int someFunction(int argument) {
printf("%i", argument);
}
doSomething = &someFunction;
完成后,您可以直接调用它:
doSomething(5); //prints 5
因为函数指针本质上只是指针,所以你确实可以将它们用作类中的实例变量。
当接受函数指针作为参数时,我更喜欢使用typedef
而不是使用函数原型中的混乱语法:
typedef int (*FunctionAcceptingAndReturningInt)(int argument);
然后,您可以使用此新定义的类型作为函数的参数类型:
void invokeFunction(int func_argument, FunctionAcceptingAndReturningInt func) {
int result = func(func_argument);
printf("%i", result);
}
int timesFive(int arg) {
return arg * 5;
}
invokeFunction(10, ×Five); //prints 50
答案 1 :(得分:2)
它不是严格答案,但是要将可配置/可分配代码作为类成员包含,我会提到使用带有operator()的类/结构。例如:
struct mycode
{
int k;
mycode(int k_) : k(k_)
{
}
int operator()(int x)
{
return x*k;
}
};
class Foo
{
public : Foo(int k) : f(k) {}
public : mycode f;
};
你可以这样做:
Foo code(5);
std::cout << code.f(2) << std::endl;
它将打印'10',我写的一切都好。
答案 2 :(得分:1)
您必须以这种方式声明f
:
void f(void (*x)())
{
x(); // call the function that you pass as parameter (Ex. s()).
}
here是一个关于函数指针和回调的优秀教程。
答案 3 :(得分:0)
要回答第3个问题,您不必在课堂上声明它。但是不要违反封装,我通常更喜欢成员函数指针或仿函数,而pointees又是类的成员。上面的示例是除了Luis G. Costantini R之外的C样式函数指针。您可以查看this的成员函数指针方法。通常考虑C样式函数指针,例如,回调机制,其中存在接收异步消息的C代码。在这种情况下,没有选项而不是在全局范围内声明处理程序方法。