为了账号安全,请及时绑定邮箱和手机立即绑定

C++用类封装函数有什么好处么?

C++用类封装函数有什么好处么?

月关宝盒 2019-04-07 11:19:20
看有的代码可以用函数实现,却用类来封装.具体例子是这样:比如STL的list容器,sort的函数可以自定义一般这样处理://comparison,notcasesensitive.boolcompare_nocase(stringfirst,stringsecond){unsignedinti=0;while((i
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

上面那种是functions,下面这种叫做functors.(我姑且翻译成函子)
两者最本质的区别在于,上面仅仅是一个过程;而下面,却可以包含状态。后者,可以轻松实现闭包。
在C++11里面,后者直接演化为lambda了。
我就用你提到的sort来举一个小例子:
cppboolmyfunction(inti,intj){return(i
structmyclass{
booloperator()(inti,intj){return(i}myobject;
std::vectormyvector{32,71,12,45,26,80,53,33};
std::sort(myvector.begin(),myvector.end(),myfunction);
std::sort(myvector.begin(),myvector.end(),myobject);
简化了你的例子,我们来关注本质区别。看起来,好像等效对不?
那么现在需求变了,排序的时候,我只希望排值大于40的元素,请问咋整,你说,只好把这个40写到函数里了。那如果我说这个40是来自用户输入呢?也可能是50或是60,请问怎么办?
此时,function好像有点没有用武之地了。但我们的functor却依然可以大显身手。
cppstructmyclass{
intflag;
myclass(inti):flag(i){}
booloperator()(inti,intj){return((flag};
std::vectormyvector{32,71,12,45,26,80,53,33};
myclassmyobject(40);
std::sort(myvector.begin(),myvector.end(),myobject);
//output:3212263345537180
例子可能有点怪。。但你明白这意思了么?
                            
查看完整回答
反对 回复 2019-04-07
?
慕斯709654

TA贡献1840条经验 获得超5个赞

这个struct其实是functor,国内译成仿函数,它的好处是可以保存状态。
我举个例子,你现在用compare_nocase的函数指针作为参数,假如突然又有一个地方要求你比较字符串,但此时要求你忽略首字母,从第二个字符串开始比较,那么你应该怎么做?
1.要么你重新写一个compare_nocase2函数,但会造成大量重复代码。
2.要么你弄个intstart变量,然后放在compare_nocase的外面,在执行我刚才说的这个需求时候,先改变start=2,执行完以后再把全局变量改回去。
可以看到,都不优雅。
或许你想到了把compare_nocase写到一个类里,但这必须要是staticmethod。
而functor的解决很简单。
cppstructmylistSort{
intstart;
mylistSort(intp){start=p;}
booloperator()(stringfirst,stringsecond)const{
inti=start-1;
while((iif(tolower(first[i])++i;
}
if(first.length()elsereturnfalse;
}
};
这样你从首字符开始比较就可以mylist.sort(mylistSort(1));而当你需要忽略首字符,从第二个字母开始比较的时候就可以mylist.sort(mylistSort(2));
这样就轻松避免了全局变量的状态管理。
事实上functor还有很多其他好处,特别是配合template来写,会发挥很大作用!
对了,C++11的话,可以这样写
cppmylist.sort([](stringfirst,stringsecond){
//比较逻辑
});
C++14的话还能把它改成auto~~
                            
查看完整回答
反对 回复 2019-04-07
  • 2 回答
  • 0 关注
  • 426 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信