本文共 5276 字,大约阅读时间需要 17 分钟。
Valarray类
模板类
格式:
基本函数:
程序示例:
studentc.h 奇怪 为毛没有彩色
#ifndef STUDENTC_H_#define STUDENTC_H_#include#include #include class Student{ private: typedef std::valarray ArrayDb; std::string name; ArrayDb scores; std::ostream & arr_out(std::ostream & os) const; public: Student() : name("Null Student"), scores() {} explicit 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; 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
student.cpp
#include "studentc.h"using std::ostream;using std::endl;using std::istream;using std::string;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];}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 <>(istream & is, Student & stu){ is >> stu.name; return is;}istream & getline(istream & is, Student & stu){ getline(is, stu.name); return is;}ostream & operator<<(ostream & os, const Student & stu){ os << "Scores for " << stu.name << ":\n"; stu.arr_out(os); return os;}
use_stuc.cpp
#include#include "studentc.h"using std::cout;using std::cin;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 << "\nResults:"; for ( i = 0; i < pupils; ++i) { cout << endl << ada[i]; cout << "average: " << ada[i].Average() < > sa[i]; while (cin.get() != '\n') continue;}
运行结果
私有继承:
私有继承与包含的区别:
如果需要调用基类的对象咋搞?
在私有继承中,在没有显式类型转换的情况下,不能将指向派生类的对象或引用赋给基类引用或指针
还有一种情况是 多重继承 编译器无法确定要转换成哪个基类 因为都有operator<<()
私有继承的程序示例:
studenti.h
#ifndef STUDENTC_H_#define STUDENTC_H_#include#include #include class Student : private std::string, private std::valarray { private: typedef std::valarray 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; const std::string & Name() const; double & operator[] (int i); double operator[] (int i) 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
studenti.cpp
#include "studenti.h"using std::ostream;using std::endl;using std::istream;using std::string;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){ return ArrayDb::operator[](i);}double Student::operator[](int i) const{ 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 <>(istream & is, Student & stu){ is >> (string &) stu; return is;}istream & getline(istream & is, Student & stu){ getline(is, (string &) stu); return is;}ostream & operator<<(ostream & os, const Student & stu){ os << "Scores for " << (string &) stu << ":\n"; stu.arr_out(os); return os;}
use_stui.cpp
#include#include "studenti.h"using std::cout;using std::cin;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 << "\nResults:"; for ( i = 0; i < pupils; ++i) { cout << endl << ada[i]; cout << "average: " << ada[i].Average() < > sa[i]; while (cin.get() != '\n') continue;}
用包含还是用私有继承?
完结
转载地址:http://mnepi.baihongyu.com/