c++ primer 习题 15.35 集成了哪一章的完整的可运行代码

/******************************************************************** *created: 2010/01/23 *created: 23:1:2010 9:35 *filename: d:/svn/cpp_primer_charpter_15/cpp_test/Basket.h *author: WWQ *purpose: 购物框类 *********************************************************************/ #pragma once #include "Sales_item.h" #include <set> class Basket { //定义multiset的比较函数 typedef bool (*Comp)(const Sales_item&,const Sales_item&); public: //make it easir to type of our set typedef std::multiset<Sales_item,Comp>set_type; //typedefs modeled after corresponding contanier types typedef set_type::size_type size_type; typedef set_type::const_iterator const_iter; Basket():items(compare){}//initialze the comparator void add_item(const Sales_item &item){items.insert(item);} size_type size(const Sales_item &i) const { return items.count(i); } double total() const;//sum of net prices for all items in the basket private: std::multiset<Sales_item,Comp> items; };

/******************************************************************** *created: 2010/01/23 *created: 23:1:2010 10:18 *filename: Basket.cpp *author: WWQ *purpose: *********************************************************************/ #include "Basket.h" double Basket::total() const {//返回购物篮中所有物品的价格 double sum=0; for (const_iter iter=items.begin(); iter!=items.end(); iter=items.upper_bound(*iter)) { sum+=(*iter)->net_price(items.count(*iter)); } return sum; }

/******************************************************************** *created: 2010/01/21 *created: 21:1:2010 20:12 *filename: d:/svn/cpp_primer_charpter_15/cpp_test/Bulk_item.h *author: WWQ *purpose: 折扣类 *********************************************************************/ #pragma once #include <iostream> #include "item_base.h" class Bulk_item : public Item_base { public: Bulk_item(const std::string& book = "", double sales_price = 0.0, size_t qty = 0, double disc_rate = 0.0): Item_base(book, sales_price), min_qty(qty), discount(disc_rate) { std::cout << "Bulk_item(const std::string &,double, size_t,double)" << std::endl; } //重定义基类版本 double net_price(size_t cnt) const { if (cnt >= min_qty) { return cnt*(1 - discount)*price; } else { return cnt*price; } } //复制控制函数 Bulk_item(const Bulk_item &b): Item_base(b), min_qty(b.min_qty), discount(b.discount) { std::cout << "Bulk_item(const Bulk_item&)" << std::endl; } Bulk_item& operator=(const Bulk_item &rhs) { if (this != &rhs) Item_base::operator=(rhs); min_qty=rhs.min_qty; discount=rhs.discount; std::cout<<"Bulk_item::operator="<<std::endl; return *this; } Bulk_item * clone() const{ return new Bulk_item(*this); } virtual ~Bulk_item(void) { std::cout<<"~Bulk_item()"<<std::endl; } private: size_t min_qty;//可打折的最小购买量 double discount;//折扣率 };

/******************************************************************** *created: 2010/01/21 *created: 21:1:2010 14:20 *filename: d:/svn/CPP_test/cpp_test/cpp_test/Disc_item.h *author: WWQ *purpose: Class to hold discount and quantity derived classes will implement pricing strategies using these data 保存折扣率和可实行折扣策略的数量 派生类将使用这些数据实现定价策略 *********************************************************************/ #pragma once #include <iostream> #include "item_base.h" class Disc_item : public Item_base { public: Disc_item(const std::string& book = "", double sales_prive = 0.0, std::size_t qty = 0, double disc_rate = 0.0): Item_base(book, sales_prive), quantity(qty), discount(disc_rate) {} double net_price(std::size_t) const=0;//定义为虚函数 //for debug virtual void debug(std::ostream & os = std::cout ) const { Item_base::debug(os); os<<"/t"<<quantity<<"/t"<<discount; } protected: std::size_t quantity;//purchase size for discount to apply double discount;//fractional discount to apply };

/******************************************************************** *created: 2010/01/21 *created: 21:1:2010 20:15 *filename: d:/svn/cpp_primer_charpter_15/cpp_test/Item_base.h *author: WWQ *purpose: 图书管理的基类 *********************************************************************/ #pragma once #include <fstream> #include <iostream> #include <string> class Item_base { public: Item_base(const std::string &book = "", double sales_price = 0.0): isbn(book), price(sales_price) { std::cout << "Item_base(const std::string &,double)" << std::endl; } std::string book()const { return isbn; } virtual double net_price(size_t n) const {//返回特定购书量的总价格 return n*price; } Item_base(const Item_base& ib): isbn(ib.isbn), price(ib.price) { //复制控制成员 std::cout << "Item_base(const Item_base&)" << std::endl; } Item_base& operator=(const Item_base& rhs) { isbn = rhs.isbn; price = rhs.price; std::cout << "Item_base::operator=()" << std::endl; return *this; } / virtual void debug(std::ostream & os = std::cout) const { os << isbn << "/t" << price;//这里出错了 } virtual Item_base* colone() const { return new Item_base(*this); } // virtual ~Item_base(void) { std::cout << "~Item_base()" << std::endl; } private: std::string isbn; protected: double price; };

/******************************************************************** *created: 2010/01/21 *created: 21:1:2010 16:53 *filename: d:/svn/CPP_test/cpp_test/cpp_test/Lds_item.h *author: WWQ *purpose: 限价折扣类 *********************************************************************/ #pragma once #include "item_base.h" class Lds_item : public Item_base { public: Lds_item(const std::string &book="", double sales_price=0.0, size_t qty=0,double disc_rate=0.0): Item_base(book,sales_price),max_qty(qty),discount(disc_rate){} double net_price(size_t cnt) const; Lds_item *clone()const { return new Lds_item(*this); } private: size_t max_qty;//可折扣的购书量上限 double discount;//折扣率 };

/******************************************************************** *created: 2010/01/23 *created: 23:1:2010 10:20 *filename: Lds_item.cpp *author: WWQ *purpose: *********************************************************************/ #include "Lds_item.h" double Lds_item::net_price( size_t cnt ) const { if (cnt<=max_qty) { return cnt*(1-discount)*price; } else { return cnt*price-max_qty*discount*price; } }

/******************************************************************** *created: 2010/01/21 *created: 21:1:2010 15:47 *filename: d:/svn/CPP_test/cpp_test/cpp_test/Sales_item.h *author: WWQ *purpose: 句柄类 *********************************************************************/ #pragma once //#include <iostream> #include <stdexcept> #include "Item_base.h" using namespace std; class Sales_item { public: Sales_item(void): p(0),//指针置0,表示没有关联任何对象 use(new std::size_t(1)){}//分配一个新的计数器 Sales_item(const Item_base &); Sales_item(const Sales_item &i): p(i.p), use(i.use) { ++*use; } ~Sales_item() { decr_use(); } Sales_item& operator=(const Sales_item&); const Item_base *operator->() const//等价于:(operator->)(),注意:不接受参数,P445 { if (p) return p;//返回该对象的一个指针 else throw std::logic_error("unbound Sales_item"); } const Item_base& operator*() const { if (p) return *p; else throw std::logic_error("unbound Sales_item"); } private: Item_base *p;//pointer to shared item std::size_t *use;//ponter to shared use count //called by both destructor and assignment operator to free pointers void decr_use() { if (--*use == 0) { delete p; delete use; } } }; inline bool compare(const Sales_item &lhs, const Sales_item &rhs) { return lhs->book() < rhs->book(); }

/******************************************************************** *created: 2010/01/21 *created: 21:1:2010 16:03 *filename: d:/svn/CPP_test/cpp_test/cpp_test/Sales_item.cpp *author: WWQ *purpose: 句柄类 实现文件 *********************************************************************/ #include "Sales_item.h" Sales_item& Sales_item::operator=( const Sales_item & rhs) { ++*rhs.use;//防止自身赋值 decr_use(); p = rhs.p; use = rhs.use; return *this; } Sales_item::Sales_item( const Item_base& item ): p(item.colone()),use(new std::size_t(1)) { }

/******************************************************************** *created: 2010/01/22 *created: 22:1:2010 9:49 *filename: d:/svn/cpp_primer_charpter_15/cpp_test/P509.cpp *author: WWQ *purpose: 练习cpp_primer 第509页的内容 习题15.35 *********************************************************************/ #include <iostream> #include "Sales_item.h" #include "Basket.h" #include "Bulk_item.h" #include "Lds_item.h" using namespace std; int main() { Basket basket; Sales_item item1(Bulk_item("7-115-14554-7", 99, 20, 0.2)); Sales_item item2(Item_base("7-115-14554-8", 39)); Sales_item item3(Lds_item("7-115-14554-9", 50, 200, 0.2)); Sales_item item4(Bulk_item("7-115-14554-7", 99, 20, 0.2)); basket.add_item(item1); basket.add_item(item2); basket.add_item(item3); basket.add_item(item4); cout << "--------------------------------" << endl; cout << "总价格是:"; cout << (basket.total()) << endl; cout << "--------------------------------" << endl; return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值