星球狂想战队|一起来学C++:C++中的代码重用( 四 )
同样 , 可以定义一个使用string版本的<
//usestringversionofoperator<因为stu.name是一个string对象 , 所以它将调用函数operatot<
同样 , 该函数也可以使用valarray的<
//privatemethodostream&Student::arr_out(ostream&os)const{inti;intlim=scores.size();if(lim>0){for(i=0;i<lim;i++){os<<scores[i]<<"";if(i%5==4)os<<endl;}if(i%5!=0)os<<endl;}elseos<<"emptyarray";returnos;}通过使用这样的辅助方法 , 可以将零乱的细节放在一个地方 , 使得友元函数的编码更为整洁:
//usestringversionofoperator<辅助函数也可用作其他用户级输出函数的构建块——如果您选择提供这样的函数的话 。
程序清单14.2是Student类的类方法文件 , 其中包含了让您能够使用[]运算符来访问Student对象中各项成绩的方法 。
程序清单14.2student.cpp
//studentc.cpp--Studentclassusingcontainment#include"studentc.h"usingstd::ostream;usingstd::endl;usingstd::istream;usingstd::string;//publicmethodsdoubleStudent::Average()const{if(scores.size()>0)returnscores.sum()/scores.size();elsereturn0;}conststring&Student::Name()const{returnname;}double&Student::operator[](inti){returnscores[i];//usevalarray::operator[]()}doubleStudent::operator[](inti)const{returnscores[i];}//privatemethodostream&Student::arr_out(ostream&os)const{inti;intlim=scores.size();if(lim>0){for(i=0;i<lim;i++){os<<scores[i]<<"";if(i%5==4)os<<endl;}if(i%5!=0)os<<endl;}elseos<<"emptyarray";returnos;}//friends//usestringversionofoperator>>()istream&operator>>(istream&is,Student&stu){is>>stu.name;returnis;}//usestringfriendgetline(ostream&,conststring&)istream&getline(istream&is,Student&stu){getline(is,stu.name);returnis;}//usestringversionofoperator<除私有辅助方法外 , 程序清单14.2并没有新增多少代码 。 使用包含让您能够充分利用已有的代码 。
3.使用新的Student类下面编写一个小程序来测试这个新的Student类 。 出于简化的目的 , 该程序将使用一个只包含3个Student对象的数组 , 其中每个对象保存5个考试成绩 。 另外还将使用一个不复杂的输入循环 , 该循环不验证输入 , 也不让用户中途退出 。 程序清单14.3列出了该测试程序 , 请务必将该程序与Student.cpp一起进行编译 。
程序清单14.3use_stuc.cpp
//use_stuc.cpp--usingacompositeclass//compilewithstudentc.cpp#include#include"studentc.h"usingstd::cin;usingstd::cout;usingstd::endl;voidset(Student&sa,intn);constintpupils=3;constintquizzes=5;intmain(){Studentada[pupils]={Student(quizzes),Student(quizzes),Student(quizzes)};inti;for(i=0;i<pupils;++i)set(ada[i],quizzes);cout<<"nStudentList:n";for(i=0;i<pupils;++i)cout<<ada[i].Name()<<endl;cout<<"nResults:";for(i=0;i<pupils;++i){cout<<endl<<ada[i];cout<<"average:"<<ada[i].Average()<<endl;}cout<<"Done.n";return0;}voidset(Student&sa,intn){cout<<"Pleaseenterthestudent'sname:";getline(cin,sa);cout<<"Pleaseenter"<<n<<"quizscores:n";for(inti=0;i<n;i++)cin>>sa[i];while(cin.get()!='n')continue;}下面是程序清单14.1~程序清单14.3组成的程序的运行情况:
推荐阅读
- 游戏小怪兽|达仁星球:最新抖音直播留人控场方法和技巧
- 巅峰战队|VERTIX户外手表,勇攀新高峰——COROS
- 星球狂想战队|世界科技格局
- 家族战队|10年后退化成了“简陋版”,快看丨腾讯微博将于9月28日停服
- 路人战队|失去苹果的代价,有300万人承担不起,请别口嗨“抵制苹果”了
- 家族战队|就读懂了湖南互联网产业,读懂了这些话
- 路人战队|雷军用了什么法宝?,超越格力?新型洗烘一体机实现“弯道超车”
- NASA|NASA发现“黄金星球”,价值超万万亿美元,美国已准备前往
- 天文在线|既有大气又有水 宝藏星球土卫六,宇宙中的超级泰坦
- 通天战队|别人偷动你手机,屏幕就会一戳一个洞,只有你可以打开,教你一招