#ifndef STUDENTC_H_
#define STUDENTC_H_
#include <iostream>
#include <valarray>
#include <string>
class Student :private std::string, std::valarray<double>
{
private:
typedef std::valarray<double>ArrayDb;
std::ostream& arr_out(std::ostream& os)const;
public:
Student() :std::string("Null Student"), ArrayDb() {}
explicit Student(const std::string& s) :std::string(s), ArrayDb() {}
explicit Student(int n) :std::string("Nully"), ArrayDb(n) {}
Student(const std::string& s, int n) :std::string(s), ArrayDb(n) {}
Student(const std::string& s, const ArrayDb& a) :std::string(s), ArrayDb(a) {}
Student(const char* str, const double* pd, int n) :std::string(str), ArrayDb(pd, n) {}
~Student() {}
double Average()const;
double& operator[](int i);//為什么有兩個版本?
double operator[](int i)const;
const std::string& Name()const;
friend std::istream& operator>>(std::istream& is, Student& stu);
friend std::istream& getline(std::istream& is, Student& stu);
friend std::ostream& operator<<(std::ostream& os, const Student& stu);
};
#endif
#include "studenti.h"
using std::istream;
using std::ostream;
using std::string;
using std::endl;
double Student::Average() const
{
if (ArrayDb::size() > 0)
return ArrayDb::sum() / ArrayDb::size();
else
return 0;
}
const string& Student::Name() const
{
return (const string&)*this;
}
double& Student::operator[](int i)//這兩個版本有什么區別?
{
std::cout << "double&\n";
return ArrayDb::operator[](i);
}
double Student::operator[](int i) const
{
std::cout << "double\n";
return ArrayDb::operator[](i);
}
ostream& Student::arr_out(ostream& os) const
{
int i;
int lim = ArrayDb::size();
if (lim > 0)
{
for (i = 0; i < lim; i++)
{
os << ArrayDb::operator[](i) << " ";
if (i % 5 == 4)
os << endl;
}
if (i % 5 != 0)
os << endl;
}
else
os << " empty array ";
return os;
}
istream& operator>>(istream& is, Student& stu)
{
std::cout << "cin\n";
is >> (string&)stu;
return is;
}
istream& getline(istream& is, Student& stu)
{
std::cout << "getline\n";
getline(is, (string&)stu);
return is;
}
ostream& operator<<(ostream& os, const Student& stu)
{
os << "Scores for " << (string&)stu << ":\n";
return stu.arr_out(os);
}
#include <iostream>
#include "studenti.h"
using std::cin;
using std::cout;
using std::endl;
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; i++)
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 << "Please enter the student's name: ";
getline(cin, sa);
// cin >> sa;
cout << "Please enter " << n << " quiz scores:\n";
for (int i = 0; i < n; i++)
cin >> sa[i];
while (cin.get() != '\n')
continue;
}
還有其他運算子需要這樣兩個版本的嗎?
uj5u.com熱心網友回復:
[]一個可以修改,一個不能修改元素值轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249589.html
標籤:C++ 語言
上一篇:C++
