AcceleratedC++/Chapter8 | AcceleratedC++/Chapter10 |
1. Chapter 9 Defining new types ¶
κΈ°λ³Έ νμ | char, int, double λ± κΈ°λ³ΈμΈμ΄μ μΌλΆ |
ν΄λμ€ νμ | string, vector, istream λ± κΈ°λ³ΈμΈμ΄λ₯Ό κ°μ§κ³ ꡬνλ νμ |
1.1. 9.1 Student_info revisited ¶
4.2.1μ Student_info ꡬ쑰체λ₯Ό λ€λ£¨λ ν¨μλ₯Ό μμ±νκ³ , μ΄λ₯Ό νκ°μ ν€λνμΌλ‘ ν΅ν©μ νλ κ²μ μΌκ΄λ λ°©λ²μ μ 곡νμ§ μκΈ° λλ¬Έμ λ¬Έμ κ° λ°μνλ€.
λ³Έ μ₯μμλ κΈ°μ‘΄μ ꡬ쑰체λ₯Ό νμ₯νμ¬ ν¨μλ₯Ό μμ±νκ³ μ΄λ°μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ μλ €μ€λ€.
λ³Έ μ₯μμλ κΈ°μ‘΄μ ꡬ쑰체λ₯Ό νμ₯νμ¬ ν¨μλ₯Ό μμ±νκ³ μ΄λ°μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ μλ €μ€λ€.
1.2. 9.2 Class types ¶
~cpp struct Student_info { std::string name; double midterm, final; std::vector<double> homework; };
νλ‘κ·Έλλ¨Έλ ꡬ쑰체λ₯Ό λ€λ£¨κΈ° μν΄μ ꡬ쑰체μ κ° λ©€λ²λ₯Ό λ€λ£¨λ ν¨μλ₯Ό μ΄μ©ν΄μΌνλ€. (Student_info λ₯Ό μΈμλ‘ κ°λ ν¨μλ μκΈ° λλ¬Έμ)
κ·Έλ¬λ νλ‘κ·Έλλ¨Έλ μ§μ μ μΌλ‘ μ΄λ° ꡬ쑰λ₯Ό λ€λ£¨κΈ° 보λ€λ μΈλΆμ μΈ κ΅¬νμ κ°μΆκ³ μΆμ μ μλ€.
μ using-μ μΈλ¬Έμ μ¬μ©νμ§ μλκ°?
string, vector μ κ°μ κ²λ€μ Student_infoμ λ΄λΆ ꡬνμμ νμν μ¬νμ΄κΈ° λλ¬Έμ Student_infoλ₯Ό μ¬μ©νλ νλ‘κ·Έλ¨μ λλ€λ₯Έ νλ‘κ·Έλλ¨Έμκ²κΉμ§ vector, stringμ std::μ μ‘΄μ¬νλ κ²μΌλ‘ μ°κΈ°λ₯Ό κ°μνλ κ²μ μ³μ§μλ€.
κ·Έλ¬λ νλ‘κ·Έλλ¨Έλ μ§μ μ μΌλ‘ μ΄λ° ꡬ쑰λ₯Ό λ€λ£¨κΈ° 보λ€λ μΈλΆμ μΈ κ΅¬νμ κ°μΆκ³ μΆμ μ μλ€.
string, vector μ κ°μ κ²λ€μ Student_infoμ λ΄λΆ ꡬνμμ νμν μ¬νμ΄κΈ° λλ¬Έμ Student_infoλ₯Ό μ¬μ©νλ νλ‘κ·Έλ¨μ λλ€λ₯Έ νλ‘κ·Έλλ¨Έμκ²κΉμ§ vector, stringμ std::μ μ‘΄μ¬νλ κ²μΌλ‘ μ°κΈ°λ₯Ό κ°μνλ κ²μ μ³μ§μλ€.
1.2.1. 9.2.1 λ©€λ² ν¨μ ¶
μκΈ°μ ꡬ쑰체μμ Student_info λ₯Ό λ€λ£° μ μλ λ©€λ²ν¨μλ₯Ό μΆκ°ν κ²
~cpp struct Student_info { std::string name; double midterm, final; std::vector<double> homework; std::istream& read(std::istream&); //μ λ ₯ μ€νΈλ¦ΌμΌλ‘ λΆν° μ λ ₯μ λ°μμ 4κ°μ λ©€λ²λ³μλ₯Ό μ΄κΈ°ννλ€. double grade() const; //λ΄λΆ λ©€λ²λ³μλ₯Ό νμ©νμ¬ μ μλ₯Ό κ³μ°νκ³ double νμΌλ‘ 리ν΄νλ€. //ν¨μ λͺ μ λ€μ constλ₯Ό λΆμ΄λ©΄ λ©€λ² λ³μμ λ³νμ ν μ μλ ν¨μκ° λλ€. (ꡬ쑰μ μΌλ‘ μ’λ€) };
- s:Student_info λΌλ©΄ λ©€λ²ν¨μλ₯Ό νΈμΆνκΈ° μν΄μλ s.read(cin), s.grade() μ κ°μ΄ ν¨μλ₯Ό μ¬μ©νλ©΄μ κ·Έ ν¨μκ° μν΄μλ κ°μ²΄λ₯Ό μ§μ ν΄μΌν¨. μ묡μ μΌλ‘ νΉμ κ°μ²΄κ° κ·Έ ν¨μμ μΈμλ‘ μ λ¬λμ΄ κ·Έ κ°μ²΄μ λ°μ΄ν°λ‘ μ κ·Όμ΄ κ°λ₯νκ² λλ€.
~cpp istream & Student_info::read(istream& in) { in>>name>>midterm>>final; read_hw(in, homework); return in; }
μ΄ ν¨μμμ μμμΌν 3κ°μ§
- ν¨μμ μ΄λ¦μ΄ Student_info::readμ΄λ€
- Student_infoμ λ©€λ²ν¨μμ΄λ―λ‘ Student_info κ°μ²΄λ₯Ό μ μν νμλ μΈμλ‘ λκΈΈ νμλ μλ€.
- κ°μ²΄ λ΄λΆμ λ°μ΄ν°λ₯Ό μ§μ μ μΌλ‘ μ κ·Ό κ°λ₯νλ€. μλ₯Ό λ€μ΄μ s.nameμΌλ‘ μ κ·Όν νμμλ€.
- ν¨μμ μ΄λ¦μ΄ Student_info::readμ΄λ€
~cpp double Student_info::grade() const { return ::grade(midterm, final, homework); }::λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ νΈμΆλλ gradeλ₯Ό κ°μ²΄μ λ©€λ²ν¨μκ° μλλΌ μ μ gradeμ νμΌλ‘ μ¬μ©νλ κ²μ΄ κ°λ₯νλ€.
κ°μ²΄μμλ const κ°μ²΄ λ΄λΆμ λ°μ΄ν°λ€μ constνμΌλ‘ λ€λ£° μλ μμ§λ§, λ©€λ²ν¨μλ₯Ό const λ©€λ²ν¨μλ‘ λ§λ¦μΌλ‘μ¨ λ³νμ μ νμ μ€ μ μλ€.
- const κ°μ²΄μ λν΄μλ const λ©€λ²ν¨μκ° μλ ν¨μλ νΈμΆ ν μ μλ€.
1.2.2. 9.2.2 λΉλ©€λ² ν¨μλ€ ¶
μ΄μ μ μ¬μ©λμλ compareμ κ°μ ν¨μλ₯Ό μ΄λ€μμΌλ‘ μ μν΄μΌ ν κ²μΈκ°?
compareν¨μλ λμΌν νμ 2κ°μ Student_infoλ₯Ό λ°μμ μλ‘λ₯Ό λΉκ΅νλ μν μ νλ€. μ΄λ°ν¨μλ₯Ό μ²λ¦¬νλ μΌλ°μ μΈ λ°©λ²μ΄ μλλ°, 9.5, 11.2.4, 11.3.2, 12.5, 13.2.1 μμ λ°°μ°κ²λ¨.
friend ν¨μλ₯Ό μλ―Ένλ κ²
compareν¨μλ λμΌν νμ 2κ°μ Student_infoλ₯Ό λ°μμ μλ‘λ₯Ό λΉκ΅νλ μν μ νλ€. μ΄λ°ν¨μλ₯Ό μ²λ¦¬νλ μΌλ°μ μΈ λ°©λ²μ΄ μλλ°, 9.5, 11.2.4, 11.3.2, 12.5, 13.2.1 μμ λ°°μ°κ²λ¨.
friend ν¨μλ₯Ό μλ―Ένλ κ²
1.3. 9.3 Protection ¶
read, gradeλ₯Ό μ μν¨μΌλ‘μ¨ Student_infoμ μ§μ μ μΈ μ κ·Όμ νμ§ μκ³ λ λ°μ΄ν°λ₯Ό λ€λ£° μ μμλ€.
κ·Έλ°λ° λ λκ°μ μ΄μ λ μμ μ΄ κ°μ²΄μ λ΄λΆλ©€λ²λ₯Ό νλ‘κ·Έλ¨μ λ€λ₯Έ λΆλΆμμ λ€λ£¨λ κ²μ κΈμ§μν€κ³ μΆλ€λ©΄?
private λ μ΄λΈ λ€μ μ‘΄μ¬νλ λ³μ, ν¨μλ€μ λΉ λ©€λ²ν¨μμμ μ κ·Όν μ μλ€. λ°λ©΄ publicμ μ κ·Όμ΄ κ°λ₯νλ€.
β» μ΄κ²μ 보면 C++μμ ν΄λμ€μ ꡬνμ Cμμ ꡬ쑰체μ ꡬνμ νμ₯μν¨ κ²μΌλ‘ λ³Ό μ μλ μ¦κ±°κ° λλ€.
λ€μμ κ°κΈ° λμΌν ννμμ λνλΈ 2κ°μ§μ κ²½μ°μ΄λ€.
κ·Έλ°λ° λ λκ°μ μ΄μ λ μμ μ΄ κ°μ²΄μ λ΄λΆλ©€λ²λ₯Ό νλ‘κ·Έλ¨μ λ€λ₯Έ λΆλΆμμ λ€λ£¨λ κ²μ κΈμ§μν€κ³ μΆλ€λ©΄?
~cpp class Student_info { public: //interface is here double grade() const; std::istream& read(std::istream&); private: //implementation is here std::string name; double midterm, final; std::vector<double> homework; };struct ν€μλ λμ class ν€μλ μ¬μ©. 보νΈλ μ΄λΈ(protection label) μ¬μ©. λ μ΄λΈμ μμμμ΄ μ¬λ¬λΆ μ€λ³΅μΌλ‘ λμλ 무κ΄ν¨.
private λ μ΄λΈ λ€μ μ‘΄μ¬νλ λ³μ, ν¨μλ€μ λΉ λ©€λ²ν¨μμμ μ κ·Όν μ μλ€. λ°λ©΄ publicμ μ κ·Όμ΄ κ°λ₯νλ€.
class ν€μλλ₯Ό μ¬μ©ν ν΄λμ€ | κΈ°λ³Έ 보νΈλͺ¨λκ° private μΌλ‘ λμνλ€. |
struct ν€μλλ₯Ό μ¬μ©ν ν΄λμ€ | κΈ°λ³Έ 보νΈλͺ¨λκ° public μΌλ‘ λμνλ€. |
~cpp class Student_info { public: double grade() const; }; struct Student_info { dobule grade() const; };
~cpp class Student_info { std::string name; public: double grade() const; }; struct Student_info { private: std::string name; public: dobule grade() const; };μΌλ°μ μΌλ‘ μλ£κ΅¬μ‘°κ° κ°λ¨ν λμλ structλ₯Ό μ΄μ©νλ€. κ·Έλ¬λ 2κ°μ§ ν€μλμ μ¬μ©μ μ°¨μ΄λ μ‘΄μ¬νμ§ μλλ€. λ¨μ§ λ¬Έμνλ₯Ό μ΄λ»κ² νλλμ μν΄ μ°¨μ΄κ° μκΈΈ λΏμ΄λ€.
1.3.1. 9.3.1 μ κ·Ό ν¨μ ¶
~cpp class Student_info { public: double grade() const; std::istream& read(std::istream&); std::string name() const {return n;} private: std::string n; double midterm, final; std::vector<double> homework; };name λ©€λ² λ³μμ μ§μ μ μΌλ‘ μ κ·Όνλ λμ μ name()ν¨μλ₯Ό λ§λ€μ΄μ μ κ·Όνλλ‘ λ§λ€μλ€. const ν¨μμ΄λ―λ‘ λ©€λ²λ³μμ λ³κ²½μ λΆννλ€. 리ν΄κ°μ΄ 볡μ¬λ κ²μ΄κΈ° λλ¬Έμ λ³κ²½μ νλλΌλ λ©€λ²λ³μμ μν₯μ μ£Όμ§λ μλλ€.
name λ©€λ² ν¨μμ κ°μ΄ ν΄λμ€ λ΄λΆμ μ μλ₯Ό νλ κ²μ inlineμΌλ‘ ν¨μλ₯Ό μ μνλ κ²λ λμΌν ν¨κ³Όλ₯Ό κ°μ§λ€. μ΄λ κ² λ©€λ²λ³μμ μ κ·Όμ μν΄μ λ§λ€μ΄μ§λ ν¨μλ₯Ό ν΅μΉ μ κ·Όν¨μ(accessor function)μ΄λΌκ³ λΆλ₯Έλ€.
μ κ·Όν¨μλ μΊ‘μνμ κΈ°λ³Έκ°λ
μ΄ λ°νλ κ²μΌλ‘ λ€λ₯Έ μΈν°νμ΄μ€ μΌλΆλ‘μλ§ μ¬μ©ν΄μΌνλ€.
~cpp bool compare(const Student_info& x, const Student_info& y) { return x.name() < y.name(); }μΈμλ‘ λ°μ λ³μλ€μ μ§μ μ κ·Όνμ§ μκ³ κ·Έ λ©€λ²ν¨μλ‘ μ κ·Όνλ€.
1.3.2. 9.3.2 λΉμ΄μλμ§ ν μ€νΈ ¶
λ§μ½ s:Student_info μ read(istream&)μ ν΅ν΄μ λ°μ΄ν°λ₯Ό μ
λ ₯νμ§ μκ³ μ s.grade()λ₯Ό μ¬μ©νλ€λ©΄ νλ‘κ·Έλ¨μ μλ¬λ₯Ό λΌ κ²μ΄λ€.
~cpp class Student_info { public: double grade() const; std::istream& read(std::istream&); std::string name() const {return n;} bool valid() const { return !homework.empty(); } // μ¬μ©μμκ² κ·Έ κ°μ²΄κ° μ ν¨ν λ°μ΄ν°λ₯Ό κ°μ‘λμ§λ₯Ό μλ €μ€λ€. private: std::string n; double midterm, final; std::vector<double> homework; };μκΈ°μ κ°μ λ°©μμΌλ‘ ν΅ν΄μ gradeλ₯Ό νΈμΆνκΈ° μ μ κ°μ²΄μ μ ν¨μ±μ κ²μ¬νλ€λ©΄ μλ¬λ₯Ό μμ λ κ²μ΄ κ°λ₯νλ€.
1.4. 9.4 The Student_info class ¶
~cpp class Student_info { public: double grade() const; std::istream& read(std::istream&); std::string name() const {return n;} bool valid() const { return !homework.empty(); } // μ¬μ©μμκ² κ·Έ κ°μ²΄κ° μ ν¨ν λ°μ΄ν°λ₯Ό κ°μ‘λμ§λ₯Ό μλ €μ€λ€. private: std::string n; double midterm, final; std::vector<double> homework; }; bool compare(const Student_info& x, const Student& y);λμΌν μΌμ νμ§λ§ νλ‘κ·Έλλ¨Έλ μ€μ λ‘ κ°μ²΄μ λ΄λΆμ ꡬνμ κ°μΆλ κ²μ΄ κ°λ₯νλ€.
'''β» μ΄λ° μμΌλ‘ ν€λνμΌμ μ 곡νκ³ μ€μ μ ꡬνλ μμ€νμΌμ μ΄λ―Έ μ»΄νμΌλ objνμΌλ‘ μ 곡νλ€λ©΄ μ€μ λ‘ νλ§€λλ μ»΄νμΌλ¬λΌλ κ·Έ μ»΄νμΌλ¬κ° μ 곡νλ ν¨μμ μ€μ ꡬνμ λ³Ό μκ° μλ€.
ν€λνμΌμ λ¨μ§ μ»΄νμΌλ¬κ° μ»΄νμΌμ ν λ μ΄λ° ν¨μκ° μ‘΄μ¬νλ€κ³ κ°μ λ§ νκ³ , μ€μ λ‘ κ·Έ ν¨μμ μ½λκ° μ‘΄μ¬νλ κ²μ νμΈ ν μ μλ κ²μ λͺ¨λ κ΄λ ¨ μ€λΈμ νΈ νμΌμ λ§ν¬νλ€μ νΈμΆν λ μλ€λ κ²μ νμΈν μ λ°μ μλ€.'''
1.5. 9.5 Constructors ¶
μμ±μ(Constructor)
κ°μ²΄κ° μ΄λ€κ² μ΄κΈ°νλλμ§λ₯Ό μ μνλ νΉλ³ν λ©€λ² ν¨μμ΄λ€. λͺ μμ μΈ νΈμΆμ μ§μνμ§ μμΌλ©°, μ€λ‘μ§ κ°μ²΄κ° μμ±λ λμλ§ μ€νλλ€.
λ§μ½ νλ‘κ·Έλλ¨Έκ° μμ±μλ₯Ό λͺ μμ μΌλ‘ μ§μ νμ§ μμΌλ©΄ μ»΄νμΌλ¬λ Default Constructorλ₯Ό λ§λ€μ΄μ£Όλλ°, μ΄ κΈ°λ³Έ μμ±μλ λͺ μμ μΈ μ΄κΈ°νλ₯Ό μ§μνμ§ μμΌλ©°, μ€λ‘μ§ λμΌν νμ λ€λ₯Έ κ°μ²΄λ‘μ μ΄κΈ°νλ§μ μ 곡νλ€.
μμ±μλ ν΄λμ€μ μ΄λ¦κ³Ό λμΌν μ΄λ¦μΌλ‘ ν¨μμ μ΄λ¦μ κ°λλ€. λν 리ν΄νμ μ΄ μλ€.
μμ±μμ κ·μΉ
κ°μ²΄κ° μ΄λ€κ² μ΄κΈ°νλλμ§λ₯Ό μ μνλ νΉλ³ν λ©€λ² ν¨μμ΄λ€. λͺ μμ μΈ νΈμΆμ μ§μνμ§ μμΌλ©°, μ€λ‘μ§ κ°μ²΄κ° μμ±λ λμλ§ μ€νλλ€.
λ§μ½ νλ‘κ·Έλλ¨Έκ° μμ±μλ₯Ό λͺ μμ μΌλ‘ μ§μ νμ§ μμΌλ©΄ μ»΄νμΌλ¬λ Default Constructorλ₯Ό λ§λ€μ΄μ£Όλλ°, μ΄ κΈ°λ³Έ μμ±μλ λͺ μμ μΈ μ΄κΈ°νλ₯Ό μ§μνμ§ μμΌλ©°, μ€λ‘μ§ λμΌν νμ λ€λ₯Έ κ°μ²΄λ‘μ μ΄κΈ°νλ§μ μ 곡νλ€.
μμ±μλ ν΄λμ€μ μ΄λ¦κ³Ό λμΌν μ΄λ¦μΌλ‘ ν¨μμ μ΄λ¦μ κ°λλ€. λν 리ν΄νμ μ΄ μλ€.
μμ±μμ κ·μΉ
- νλμ΄μμ μμ±μκ° μ‘΄μ¬νλ€λ©΄ νμ¬ μν©μ λ§λ μμ±μλ₯Ό μ ννμ¬ μ€νλλ€.
- λ΄μ₯ νμ
κ°μ²΄μΈ κ²½μ° κ°μ§μ μ΄κΈ°νμμλ 0μΌλ‘ λν΄νΈ μ΄κΈ°ν μμλ μ μλμ§ μμ κ°μΌλ‘ μΈν
λλ€.
- μμ±μλ₯Ό κ°μ§ μλ νμ
μΈ κ²½μ°. κ°μ²΄λ₯Ό μ΄λ€ μμΌλ‘ μ΄κΈ°ννλ κ°μ λ°λΌμ κ°μ§μ , λν΄νΈ μ΄κΈ°νλ₯Ό μ¬κ·μ μΌλ‘ νν¨.
~cpp class Student_info { public: Student_info(); Student_info(std::istream&); };
1.5.1. 9.5.1 κΈ°λ³Έ μμ±μ ¶
Default Constructor?
μλ¬΄λ° μΈμλ₯Ό κ°μ§ μλ μμ±μ. κΈ°λ³Έ μμ±μλ λ³΄ν΅ κ·Έ κ°μ²΄μ λ°μ΄ν° λ©€λ²λ€μ μ λΉν μ΄κΈ°νμν€κΈ°λ§ ν¨.
μμ±μ μ΄κΈ° μ€μ μ(constructor initializer)
μκΈ°μμ 보λ―μ΄ : { μ¬μ΄μ μμ±μλ₯Ό λͺ
μμ μΌλ‘ μ¬μ©ν¨μΌλ‘μ¨ κ°μ²΄λ₯Ό μ΄κΈ°ννλ μμ
μ νλ μ€μ 0μΌλ‘ μ΄κΈ°ν ν¨μΌλ‘μ¨ μ€λ²ν€λλ₯Ό μ€μ΄λ κ²μ΄ κ°λ₯νλ€.
β»λ§μ½ κ°μ²΄μ λ©€λ²λ‘ const λ©€λ²κ° μ‘΄μ¬νλ€λ©΄ κ·Έ λ©€λ²λ λ°λμ μ΄ ννμΌλ‘λ§ μ΄κΈ°νκ° κ°λ₯νλ€. κ°μ²΄κ° μ΄κΈ°ν λλ μκΈ°λ μμ±μ μ½λλ‘ μ§μ λκΈ° μ΄μ μΈλ° μΌλ¨ μ΄κΈ°νλ const λ©€λ²λ μ»΄νμΌλ¬κ° κ·Έ κ°μ μμ μ νμ©νμ§ μκΈ° λλ¬Έμ΄λ€.
μλ¬΄λ° μΈμλ₯Ό κ°μ§ μλ μμ±μ. κΈ°λ³Έ μμ±μλ λ³΄ν΅ κ·Έ κ°μ²΄μ λ°μ΄ν° λ©€λ²λ€μ μ λΉν μ΄κΈ°νμν€κΈ°λ§ ν¨.
~cpp Student_info::Student_info():midterm(0). final(0) {} // n, homework μ κ²½μ° STLμμ μ 곡λλ λν΄νΈ μμ±μκ° μ¬κ·μ μΌλ‘ νΈμΆ
κ°μ²΄μ μμ± μμ |
* ꡬν μμ€ν
μ΄ κ°μ²΄λ₯Ό λ΄μλ§ν λ©λͺ¨λ¦¬λ₯Ό ν λΉν¨. * μ΄κΈ° μ€μ μ λͺ©λ‘μ μν΄ κ°μ²΄λ€μ μ΄κΈ°ν * μμ±μ 본체λ₯Ό μ€ν |
β»λ§μ½ κ°μ²΄μ λ©€λ²λ‘ const λ©€λ²κ° μ‘΄μ¬νλ€λ©΄ κ·Έ λ©€λ²λ λ°λμ μ΄ ννμΌλ‘λ§ μ΄κΈ°νκ° κ°λ₯νλ€. κ°μ²΄κ° μ΄κΈ°ν λλ μκΈ°λ μμ±μ μ½λλ‘ μ§μ λκΈ° μ΄μ μΈλ° μΌλ¨ μ΄κΈ°νλ const λ©€λ²λ μ»΄νμΌλ¬κ° κ·Έ κ°μ μμ μ νμ©νμ§ μκΈ° λλ¬Έμ΄λ€.
1.5.2. 9.5.2 μΈμλ₯Ό μ¬μ©νλ μμ±μ ¶
~cpp Student_info::Student_info(istream& is) {read(is);}μ΄ μμ±μλ μ€μ§μ μΈ μμ μ read ν¨μμ μμν©λλ€.
1.5.3. 9.5.3 Entire Source File ¶
~cpp //Student_info.h #ifndef GUARD_Student_info #define GUARD_Student_info #include <string> #include <vector> class Student_info { public: Student_info(); // construct an empty `Student_info' object Student_info(std::istream&); // construct one by reading a stream std::string name() const { return n; } bool valid() const { return !homework.empty(); } // as defined in 9.2.1/157, and changed to read into `n' instead of `name' std::istream& read(std::istream&); double grade() const; // as defined in 9.2.1/158 private: std::string n; double midterm, final; std::vector<double> homework; }; bool compare(const Student_info&, const Student_info&); #endif
~cpp //Student_info.cpp #include <iostream> #include <vector> #include "grade.h" #include "Student_info.h" using std::istream; using std::vector; double Student_info::grade() const { return ::grade(midterm, final, homework); } bool compare(const Student_info& x, const Student_info& y) { return x.name() < y.name(); } Student_info::Student_info(): midterm(0), final(0) { } Student_info::Student_info(istream& is) { read(is); } // read homework grades from an input stream into a `vector<double>' istream& read_hw(istream& in, vector<double>& hw) { if (in) { // get rid of previous contents hw.clear(); // read homework grades double x; while (in >> x) hw.push_back(x); // clear the stream so that input will work for the next student in.clear(); } return in; } istream& Student_info::read(istream& in) { in >> n >> midterm >> final; read_hw(in, homework); return in; }
1.6. 9.6 Using the Student_info class ¶
~cpp //grading_prog.cpp #include <algorithm> #include <iomanip> #include <ios> #include <iostream> #include <stdexcept> #include <string> #include <vector> using std::max; #include "Student_info.h" #include "median.h" using std::cin; using std::cout; using std::domain_error; using std::endl; using std::setprecision; using std::setw; using std::sort; using std::streamsize; using std::string; using std::vector; int main() { vector<Student_info> students; Student_info record; string::size_type maxlen = 0; // read and store the data while (record.read(cin)) { // changed maxlen = max(maxlen, record.name().size()); // changed students.push_back(record); } // alphabetize the student records sort(students.begin(), students.end(), compare); // write the names and grades for (vector<Student_info>::size_type i = 0; i != students.size(); ++i) { cout << students[i].name() // this and the next line changed << string(maxlen + 1 - students[i].name().size(), ' '); try { double final_grade = students[i].grade(); // changed streamsize prec = cout.precision(); cout << setprecision(3) << final_grade << setprecision(prec) << endl; } catch (domain_error e) { cout << e.what() << endl; } } return 0; }
AcceleratedC++