星球狂想战队|一起来学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组成的程序的运行情况: