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