C++primer 15.8.1节练习

本文介绍了一个基于C++实现的图书报价系统,该系统通过继承和多态等特性支持不同类型的图书折扣策略,并展示了如何使用智能指针和集合来管理订单。

练习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 }

 

转载于:https://www.cnblogs.com/wuyinfenghappy/p/7543342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值