练习15.30
1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #include <memory> 5 #include <vector> 6 #include <set> 7 8 using namespace std; 9 10 class Quote { 11 public: 12 Quote() : bookNo(""), price(0.0) { cout << "默认构造函数" << endl; } 13 Quote(const string &book, double sales_price) : bookNo(book), price(sales_price) { cout << "构造函数"<< endl; } 14 Quote(const Quote& q) : bookNo(q.bookNo), price(q.price) { cout << "拷贝构造函数" << endl; } 15 Quote(Quote &&q) noexcept : bookNo(q.bookNo), price(q.price) { cout << "移动构造函数" << endl; } 16 Quote& operator=(const Quote& rhs); 17 Quote& operator=(Quote&& rhs) noexcept; 18 const string& isbn() const { return bookNo; } 19 virtual double net_price(size_t n) const { return n * price; } 20 virtual Quote* clone() const & { return new Quote(*this); } 21 virtual Quote* clone() && {return new Quote(std::move(*this));} 22 virtual ~Quote() = default; 23 private: 24 string bookNo; 25 protected: 26 double price = 0.0; 27 }; 28 29 class Disc_quote : public Quote { 30 public: 31 Disc_quote() : Quote() { cout << "派生类默认构造函数" << endl; } 32 Disc_quote(const string &book, double sales_price, size_t quan, double dis) : Quote(book, sales_price), quantity(quan), discount(dis) { cout << "派生类构造函数" <<endl; } 33 Disc_quote(const Disc_quote& d) : Quote(d), quantity(d.quantity), discount(d.discount) { cout << "派生类拷贝构造函数" <<endl; } 34 Disc_quote(Disc_quote&& d) : Quote(std::move(d)), quantity(d.quantity), discount(d.discount) { cout << "派生类移动构造函数" << endl; } 35 Disc_quote& operator=(const Disc_quote& rhs); 36 Disc_quote& operator=(Disc_quote&& rhs); 37 double net_price(size_t n) const override; 38 ~Disc_quote() { cout << "派生类析构函数" << endl; } 39 protected: 40 size_t quantity = 0; 41 double discount = 0.0; 42 }; 43 44 class Bulk_quote : public Disc_quote { 45 public: 46 Bulk_quote() = default; 47 Bulk_quote(const string& book, double p, size_t qty, double disc) : Disc_quote(book, p, qty, disc) {} 48 double net_price(size_t n) const override; 49 Bulk_quote* clone() const & { return new Bulk_quote(*this); } 50 Bulk_quote* clone() && {return new Bulk_quote(std::move(*this));} 51 }; 52 53 class lim_discount : public Disc_quote { 54 public: 55 using Disc_quote::Disc_quote; 56 double net_price(size_t n) const override; 57 }; 58 59 class Basket { 60 public: 61 void add_item(const Quote& sale) { items.insert(shared_ptr<Quote>(sale.clone())); } 62 void add_item(Quote&& sale) { items.insert(shared_ptr<Quote>(std::move(sale).clone())); } 63 double total_receipt(ostream& os) const; 64 private: 65 static bool compare(const shared_ptr<Quote> &lhs, const shared_ptr<Quote> &rhs) { return lhs->isbn() < rhs->isbn(); } 66 multiset<shared_ptr<Quote>, decltype(compare)*> items{ compare }; 67 }; 68 69 double print_total(ostream& os, const Quote& item, size_t t); 70 71 int main() 72 { 73 /*vector<shared_ptr<Quote>> basket; 74 basket.push_back(make_shared<Quote>("C++ primer", 128.00)); 75 basket.push_back(make_shared<Bulk_quote>("C++ plus", 135.2, 15, 0.6)); 76 Bulk_quote b1("C plus", 102.3, 10, 0.9); 77 basket.push_back(make_shared<Bulk_quote>(b1)); 78 cout << basket.back()->net_price(15) << endl;*/ 79 Basket b1; 80 b1.add_item(Quote("C++", 132.5)); 81 b1.add_item(Bulk_quote("C++", 132.5, 10, 0.6)); 82 b1.total_receipt(cout); 83 system("pause"); 84 return 0; 85 } 86 87 double print_total(ostream & os, const Quote &item, size_t t) 88 { 89 double ret = item.net_price(t); 90 os << "ISBN: " << item.isbn() << " # sold: " << t << " total due: " << ret << endl; 91 return ret; 92 } 93 94 double Bulk_quote::net_price(size_t n) const 95 { 96 if (n >= quantity) 97 return n * (1 - discount) * price; 98 else 99 return n * price; 100 } 101 102 double lim_discount::net_price(size_t n) const 103 { 104 if (n <= quantity) 105 return n * (1 - discount) * price; 106 else 107 return Quote::net_price(n); 108 } 109 110 Quote & Quote::operator=(const Quote & rhs) 111 { 112 bookNo = rhs.bookNo; 113 price = rhs.price; 114 cout << "拷贝赋值运算符" << endl; 115 return *this; 116 // TODO: 在此处插入 return 语句 117 } 118 119 Quote & Quote::operator=(Quote && rhs) noexcept 120 { 121 bookNo = rhs.bookNo; 122 price = rhs.price; 123 cout << "移动赋值运算符" << endl; 124 return *this; 125 // TODO: 在此处插入 return 语句 126 } 127 128 Disc_quote & Disc_quote::operator=(const Disc_quote & rhs) 129 { 130 Quote::operator=(rhs); 131 quantity = rhs.quantity; 132 discount = rhs.discount; 133 cout << "派生类的拷贝构造运算符" << endl; 134 return *this; 135 // TODO: 在此处插入 return 语句 136 } 137 138 Disc_quote & Disc_quote::operator=(Disc_quote && rhs) 139 { 140 Quote::operator=(rhs); 141 quantity = rhs.quantity; 142 discount = rhs.discount; 143 cout << "派生类移动构造运算符" << endl; 144 return *this; 145 // TODO: 在此处插入 return 语句 146 } 147 148 double Disc_quote::net_price(size_t n) const 149 { 150 if (n >= quantity) 151 return n * (1 - discount) * price; 152 else 153 return n * price; 154 } 155 156 double Basket::total_receipt(ostream & os) const 157 { 158 double sum = 0.0; 159 for (auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter)) 160 { 161 sum += print_total(os, **iter, items.count(*iter)); 162 } 163 os << "Total Sale: " << sum << endl; 164 return sum; 165 }