C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续](二)

2014-11-24 12:54:57 · 作者: · 浏览: 6
ase { public: Disc_item(const std::string &book = "", double sales_price = 0.0, std::size_t qty = 0, double disc_rate = 0.0): Item_base(book,sales_price),quantity(qty),discount(disc_rate) {} virtual double net_price(std::size_t ) const = 0; std::pair discount_policy() const { return std::make_pair(quantity,discount); } protected: std::size_t quantity; double discount; }; class Bulk_item : public Disc_item { public: Bulk_item(const std::string &book = "", double sales_price = 0.0, std::size_t qty = 0, double disc_rate = 0.0): Disc_item(book,sales_price,qty,disc_rate) {} virtual double net_price(std::size_t n) const { if (n >= quantity) { return n * (1 - discount) * price; } else { return n * price; } } virtual Bulk_item *clone() const { return new Bulk_item(*this); } }; class Lds_item : public Disc_item { public: Lds_item(const std::string &book = "", double sales_price = 0.0, std::size_t qty = 0, double disc_rate = 0.0): Disc_item(book,sales_price,qty,disc_rate) {} virtual double net_price(std::size_t n) const { if (n <= quantity) { return n * (1 - discount) * price; } else { return n * price - quantity * discount * price; } } virtual Lds_item *clone() const { return new Lds_item(*this); } }; #endif // ITEM_H_INCLUDED
//2 in sales_item.h
#ifndef SALES_ITEM_H_INCLUDED
#define SALES_ITEM_H_INCLUDED

#include "item.h"
#include 
  
   

class Sales_item
{
public:
    Sales_item():p(0),use(new std::size_t(1)) {}
    Sales_item(const Item_base &rhs):
        p(rhs.clone()),use(new std::size_t(1)) {}

    Sales_item(const Sales_item &rhs):p(rhs.p),use(rhs.use)
    {
        ++ *use;
    }

    ~Sales_item()
    {
        decr_use();
    }

    Sales_item &operator=(const Sales_item &rhs);

    const Item_base *operator->() const
    {
        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;
    std::size_t *use;

    void decr_use()
    {
        if (-- *use)
        {
            delete p;
            delete use;
        }
    }
};

#endif // SALES_ITEM_H_INCLUDED

  

//3 in sales_item.cpp
#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;
}

//4 in basket.h
#ifndef BASKET_H_INCLUDED
#define BASKET_H_INCLUDED

#include "sales_item.h"
#include 
  
   

inline bool
compare(const Sales_item &lhs,const Sales_item &rhs)
{
    return lhs -> book() < rhs -> book();
}

class Basket
{
    typedef bool (*Comp)(const Sales_item &,const Sales_item &);
public:
    typedef std::multiset
   
     set_type; typedef set_type::size_type size_type; typedef set_type::const_iterator const_iter; Basket():items(compare){} void add_item(const Sales_item &item) { items.insert(item); } size_type size(const Sales_item &item) const { return items.count(item); } double total() const; private: std::multiset
    
      items; }; #endif // BASKET_H_INCLUDED 
    
   
  

//5 in basket.cpp
#include "basket.h"

double Basket::total() const
{
    double sum = 0.0;

    for (set_type::iterator iter = items.begin();
            iter != items.end();
            iter = items.upper_bound(*iter))
    {
        sum += (*iter) -> net_price(items.count(*iter));
    }

    return sum;
}

//6 in main.cpp
#include 
  
   
#include "item.h"
#include "basket.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-7",39));
    Sales_item item3(Lds_item("7-115-14554-7",50,200,0.2));
    Sales_item item4(Bulk_item("7-115-14554-7",99,20,0.2));

    basket.add_item(item1);
    basket.a