概述
练习7,20
友元出现的情况是当其他类或者函数需要访问他的非公有成员时;利:可以让别的类或函数访问类的私有数据成员。弊:数据成员的安全性可能会降低。
练习7.21
使用了更多的函数来取得私有成员的值,保证原本程序的正常运行;
1 #include <iostream> 2 #include <string> 3 #include "factmain.h" 4 using namespace std; 5 6 struct Sales_data { 7 friend ostream &print(ostream &os, const Sales_data &item); 8 friend istream &read(istream &is, Sales_data &item); 9 private: 10 string bookNo; 11 unsigned units_sold; 12 double price = 0.0; 13 double revenue = 0.0; 14 public: 15 Sales_data() = default; 16 Sales_data(const string &s, const unsigned &u, const double &p) : bookNo(s), units_sold(u), price(p) {}; 17 Sales_data(const string &s, const unsigned &u) : bookNo(s), units_sold(u) {}; 18 Sales_data(istream &is); 19 string isbn() const { return bookNo; } 20 unsigned &rUnit() { return units_sold; } 21 double &rPrice() { return price; } 22 double &rRevenue() { return revenue; } 23 Sales_data &combine(const Sales_data&); 24 }; 25 26 Sales_data add(const Sales_data &lhs, const Sales_data &rhs); 27 ostream &print(ostream &os, const Sales_data &item); 28 istream &read(istream &is, Sales_data &item); 29 30 31 int main() //main函数的部分需要改变 32 { 33 Sales_data test1("hello",56); 34 print(cout, test1); 35 Sales_data item1(cin); 36 Sales_data item2; 37 double totalRevenue = 0; 38 double totalSold = 0; 39 int counter = 1; 40 if ((item1.isbn()).empty()) 41 { 42 item1.rRevenue() = item1.rPrice() * item1.rUnit(); 43 while (read(cin,item2)) { 44 item2.rRevenue() = item2.rPrice() * item2.rUnit(); 45 if (item1.isbn() == item2.isbn()) { 46 item1.combine(item2); 47 ++counter; 48 } 49 else { 50 print(cout, item1) << endl; 51 item1.isbn() = item2.isbn(); 52 item1.rUnit() = item2.rUnit(); 53 item1.rRevenue() = item2.rRevenue(); 54 counter = 1; 55 } 56 } 57 print(cout, item2) << endl; 58 } 59 system("pause"); 60 return 0; 61 } 62 63 Sales_data add(const Sales_data & lhs, const Sales_data & rhs) //非成员函数add 64 { 65 Sales_data sum = lhs; 66 sum.combine(rhs); 67 return sum; 68 // TODO: 在此处插入 return 语句 69 } 70 71 istream & read(istream & is, Sales_data & item) 72 { 73 is >> item.bookNo >> item.units_sold >> item.price; 74 item.revenue = item.units_sold * item.price; 75 return is; 76 // TODO: 在此处插入 return 语句 77 } 78 79 ostream & print(ostream & os, const Sales_data & item) 80 { 81 os << item.bookNo << " " << item.units_sold << " " << item.price << " " << item.revenue; 82 return os; 83 // TODO: 在此处插入 return 语句 84 } 85 86 Sales_data & Sales_data::combine(const Sales_data &rhs) 87 { 88 units_sold += rhs.units_sold; 89 revenue += rhs.revenue; 90 return *this; 91 } 92 93 Sales_data::Sales_data(istream & is) 94 { 95 read(is, *this); 96 }
练习7.22
见最终版本
转载于:https://www.cnblogs.com/wuyinfenghappy/p/7293973.html
最后
以上就是冷静太阳为你收集整理的C++primer 7.2.1节练习的全部内容,希望文章能够帮你解决C++primer 7.2.1节练习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复