如何定义一个函数指针,指向一个带有默认值参数的函数?

cqqqq 2009-01-04 12:00:08
比如如何定义这个函数的函数指针
void fun(int a,int b=0)
{
}
...全文
1680 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yulinlin19901219 2012-01-12
  • 打赏
  • 举报
回复
有学到东西了,感谢各位@@
mingpen 2010-07-21
  • 打赏
  • 举报
回复
在VC++6.0环境下,可以实现
typedef void (*pfun)(int, int b=0);
pauliuyou 2009-01-23
  • 打赏
  • 举报
回复
学习了
yutaooo 2009-01-22
  • 打赏
  • 举报
回复

既然你能够使用参数的默认值,那我就要假定你用的是C++而不是C。

在C++中,如3楼所述,是用函数子或叫函数对象来实现的。

这里的关键问题在于,普通的函数是不能携带状态的,而函数对象可以。

以下是一个实现。




#include <cstdio>

using std::printf;

class ff {
public:
explicit ff(int value = 3)
: value_(value) {}
void operator()() {
printf("%d\n", value_);
}
private:
int value_;
};

void fff(ff f) {
f();
}

int main() {
fff(ff());

return 0;
}

cqqqq 2009-01-22
  • 打赏
  • 举报
回复
其他的方法怎么实现类似的效果?
arong1234 2009-01-22
  • 打赏
  • 举报
回复
你都不看人家回帖,你还问什么,上面不是一堆话说这不可用函数指针来做么?
[Quote=引用 9 楼 cqqqq 的回复:]
C/C++ codevoid ff(int a=3)
{
printf("%d",a);
}
void fff(void(*f)(int))
{
f();
}
int main()
{
fun1();
fff(ff);
getchar();
return 0;
}


这个会报错,如何实现带默认值的回调?
[/Quote]
arong1234 2009-01-22
  • 打赏
  • 举报
回复
默认值是不可继承,不可携带,这是编译器在你用指定得函数名调用这个函数时一个附加得优化,在你调用函数不提供缺省参数时,他会给你加一个。

注意:这是编译时有用得信息,运行过程中是没有所谓得缺省参数这种概念得,因此也不可能用函数指针来使用缺省参数
cqqqq 2009-01-22
  • 打赏
  • 举报
回复
void ff(int a=3)
{
printf("%d",a);
}
void fff(void(*f)(int))
{
f();
}
int main()
{
fun1();
fff(ff);
getchar();
return 0;
}

这个会报错,如何实现带默认值的回调?
waizqfor 2009-01-04
  • 打赏
  • 举报
回复
UP
arong1234 2009-01-04
  • 打赏
  • 举报
回复
记住:默认值是编译时信息,运行时刻是不可能有的,这种信息不继承,不传递,你可以认为任何函数在编译后就没有所谓的默认值了,在编译过程中,默认值会被直接替换调
arong1234 2009-01-04
  • 打赏
  • 举报
回复
函数带默认值,他的指针是不可能把这种默认值带过去的。默认值是编译期信息,而你要的是运行时的默认值,这在函数指针是不可实现的。

唯一可以做到的是用functor,用一个函数类对象实现。如果一个类实现了()运算符,他就可以象一个函数来用,而对于你的要求,可以通过实现不同版本的()实现

ljmscsq 2009-01-04
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

void fun(int a,int b=0)
{
cout<<"hello"<<endl;
}

int main()
{
void (*p)(int,int);//定义函数指针
p=fun; //函数名是地址,和数组名一样
p(0,0); //用指针调用函数
return 0;
}

输出是hello
rejoice914 2009-01-04
  • 打赏
  • 举报
回复
void (*fun)(int a,int b=0)
{
}
星羽 2009-01-04
  • 打赏
  • 举报
回复
建议使用typedef 否则函数复杂了看起来很混乱


void fun(int a,int b=0)
{
}

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

int main()
{
pfun funImpl = &fun;
funImpl(1, 1);

return 0;
}



ps: 函数指针声明不能带默认参数
jcwKyl 2009-01-04
  • 打赏
  • 举报
回复
呵呵,帖子发的晚了,楼上的把所有东西都说了。当6楼的帖子没发过。向楼上的朋友们学习!
jcwKyl 2009-01-04
  • 打赏
  • 举报
回复
同意楼上的,再补充一点。默认值参数不影响函数类型。比如你给的那个例子:
void fun(int a,int b=0)
这个函数的类型就是:void (*)(int,int)的,即使你的第二个参数有默认值。所以,在定义函数指针时,不用考虑默认值参数,把所有参数都当成正常参数就行。
另外,在定义函数指针的时候是不能够有默认参数的,比如定义一个指向你给的函数的指针:
void (*pF)(int , int = 0)是错误的,编译通不过,错误信息是:
error C2383: 'pF' : default-arguments are not allowed on this symbol

70,017

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧