请教代码重用的一个试例
//以下是一个包含对象成员的类的度例
//但编译时总有两条错误,
//请大家帮忙看看
//这是一个studentc.h文件
#ifndef STUDENTC_H
#define STUDENTC_H
#include<iostream>
#include<cstring>
#include<valarray>
//using namespace std;
class Student
{
private:
typedef std::valarray<double> ArrayDb;//定义一个类型
std::string name;//string类的name 对象
ArrayDb scores;//arraydb类的scores对象
std::ostream & arr_out(std::ostream & os)const;//定义了个输出
public:
//下面为几个构造函数:
Student():name("Null name"),scores(){}
Student(const std::string & s):name(s),scores(){}
explicit Student(int n):name("Nully"),scores(n){}
Student(const std::string & s,int n)
:name(s),scores(n){}
Student(const std::string & s,const ArrayDb & a)
:name(s),scores(a){}
Student(const char *str,const double *pd,int n)
:name(str),scores(pd,n){}
~Student(){}
double Average()const;//求平均成绩
const std::string & Name()const;
double & operator[](int i);
double operator[](int i)const;
//friends
//input
friend std::istream & operator>>(std::istream & is,
Student & stu);
friend std::istream & getline(std::istream & is,
Student & stu);
//output
friend std::ostream & operator<<(std::ostream & os,
const Student & stu);
};
#endif
//这是类的实现student.cpp文件
//student.cpp___student class using containment
#include"studentc.h"
using std::ostream;
using std::endl;
using std::istream;
using std::string;
//public methods
double Student::Average()const
{
if(scores.size()>0)
return scores.sum()/scores.size();
else
return 0;
}
const string & Student::Name()const
{
return name;
}
double & Student::operator [](int i)
{
return scores[i];
}
double Student::operator [](int i)const
{
return scores[i];
}
//private method
ostream & Student::arr_out(ostream & os)const
{
int i;
int lim=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;
}
else
os<<"empty array";
return os;
}
//friends
//use string version of operator>>()
istream & operator>>(istream & is,Student & stu)
{
is>>stu.name;
return is;
}
//use string friend getline(ostream &,const string &)
istream & getline(istream & is,Student & stu)
{
getline(is,stu.name);
return is;
}
//use string version of operator<<()
ostream & operator<<(ostream & os,const Student & stu)
{
os<<"Scores for"<<stu.name<<":\n";
stu.arr_out(os);//use private method for scores
return os;
}
//以下是用以测试的use_stuc.cpp文件
#include<iostream>
#include"studentc.h"
using std::cin;
using std::cout;
using std::endl;
//using namespace std;
void set(Student & sa,int n);
const int pupils=3;
const int quizzes=5;
int main()
{
Student ada[pupils]=
{Student(quizzes),Student(quizzes),Student(quizzes)};
int i;
for(i=0;i<pupils;)
set(ada[i],quizzes);
cout<<"\nStudent List:\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";
return 0;
}
void set(Student & sa,int n)
{
cout<<"Plaese enter the student's name:";
getline(cin,sa);
cout<<"Please enter"<<n<<"quiz scores:\n";
for(int i=0;i<n;i++)
cin>>sa[i];
while(cin.get()!='\n')
continue;
}
[解决办法]
很乱
h-------#ifndef STUDENTC_H #define STUDENTC_H #include <iostream> #include <valarray> /*#include <string>*///using namespace std; class Student { private: typedef std::valarray <double> ArrayDb;//定义一个类型 std::string name;//string类的name 对象 ArrayDb scores;//arraydb类的scores对象 std::ostream & arr_out(std::ostream & os)const;//定义了个输出 public: //下面为几个构造函数: Student():name("Null name"),scores(){} Student(const std::string & s):name(s),scores(){} explicit Student(int n):name("Nully"),scores(n){} Student(const std::string & s,int n) :name(s),scores(n){} Student(const std::string & s,const ArrayDb & a) :name(s),scores(a){} Student(const char *str,const double *pd,int n) :name(str),scores(pd,n){} ~Student(){} double Average()const;//求平均成绩 const std::string & Name()const; double & operator[](int i); double operator[](int i)const; //friends //input friend std::istream & operator >>(std::istream & is, Student & stu); friend std::istream & Mygetline(std::istream & is, Student & stu); //output friend std::ostream & operator <<(std::ostream & os, const Student & stu); }; #endif cpp------#include <string>using namespace std;//public methods double Student::Average()const { if(scores.size() >0) return scores.sum()/scores.size(); else return 0; } const string & Student::Name()const { return name; } double & Student::operator [](int i) { return scores[i]; } double Student::operator [](int i)const { return scores[i]; } //private method ostream & Student::arr_out(ostream & os)const { int i; int lim=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; } else os <<"empty array"; return os; } //friends //use string version of operator >>() istream & operator >>(istream & is,Student& stu) { is >> stu.name; return is; } //use string friend getline(ostream &,const string &) istream& Mygetline(istream & is,Student& stu) { getline(is, stu.name); return is; } //use string version of operator <<() ostream & operator <<(ostream & os,const Student & stu) { os <<"Scores for" <<stu.name <<":\n"; stu.arr_out(os);//use private method for scores return os; } main.cpp---------#include <iostream> using std::cin; using std::cout; using std::endl; //using namespace std; void set(Student & sa,int n); const int pupils=3; const int quizzes=5; int main() { Student ada[pupils]= {Student(quizzes),Student(quizzes),Student(quizzes)}; int i; for(i=0;i <pupils;) set(ada[i],quizzes); cout <<"\nStudent List:\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"; return 0; } void set(Student & sa,int n) { cout <<"Plaese enter the student 's name:"; Mygetline(cin,sa); cout <<"Please enter" <<n <<"quiz scores:\n"; for(int i=0;i <n;i++) cin >>sa[i]; while(cin.get()!= '\n ') continue; }