65,208
社区成员
发帖
与我相关
我的任务
分享
class Item_base
{
public:
Item_base(const string &book ="",double sales_price = 0.0):isbn(book),price(sales_price){}
string book() const { return isbn;}
virtual double net_price (size_t n) const {return n * price;}
virtual ~Item_base(){}
virtual Item_base *clone() const
{ return new Item_base(*this); }
private:
string isbn;
protected:
double price;
};
class Bulk_item: public Item_base
{
public:
Bulk_item():min_qty(0),discount(0.0){}
Bulk_item(const string &book,double sales_price,size_t qty=0, double disc_rate = 0.0):
Item_base(book,sales_price), min_qty ( qty), discount(disc_rate){}
double net_price(size_t) const;
virtual Bulk_item *clone() const
{ return new Bulk_item(*this); }
private:
size_t min_qty;
double discount;
};
double Bulk_item::net_price(size_t cnt) const
{
return cnt >=min_qty ? cnt * (1 - discount)*price : cnt * price;
}
void print_total (ostream &os, const Item_base &item, size_t n)
{
os << "ISBN: " << item.book() << "\tnumber sold: " << n <<"\ttotal price:"
<< item.net_price(n) << endl;
}
class Sales_item
{
public:
Sales_item():h( ){}
Sales_item(const Item_base &item):h(item.clone()){}
const Item_base &operator*() const { return *h; }
const Item_base *operator->() const { return h.operator->();}
private:
Handle<Item_base> h;
};
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 multiset<Sales_item,Comp> 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 & i) const
{return items.count(i);}
double total()const;
private:
set_type items;
};
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;
}