primer4ed中习题15.35有谁编译通过了?
c++primer第四版习题15.35
------------------
//Basket.h
#ifndef BASKET_H
#define BASKET_H
#include "Sales_item.h "
#include <set>
inline bool
compare (const Sales_item &lhs,const Sales_item &rhs)
{
return lhs-> book() < rhs-> book();
}
class Basket{
//用于mutiset元素排序的比较函数的类型
typedef bool (*Comp) (const Sales_item&,const Sales_item&);
public:
// multiset成员类型
typedef std::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:
std::multiset <Sales_item,Comp> items;
};
#endif
-----------------
//Basket.cpp
#include "Basket.h "
double Basket::total() const
{
double sum=0.0;//holds the running total
//找出具有相同ISBN的每一组物品,根据其总数计算价格
//iter指向ISBN相同的每一组中的第一个元素
// upper_bound指向具有不同ISBN的下一个元素
for (const_iter iter=items.begin();
iter !=items.end();
iter = items.upper_bound(*iter))
{
// 根据基础Item_base对象的类型调用相应的net_price函数
sum+=(*iter)-> net_price(items.count(*iter));
}
return sum;
}
--------------------
Item.h
#ifndef ITEM_H
#define ITEM_H
#include <string>
//不使用折扣策略的类
class Item_base{
public:
Item_base(const std::string &book = " ",
double sales_price =0.0):
isbn(book),price(sales_price){}
std::string book() const
{
return isbn;
}
//返回特定 购书量的总价格
//派生类将重载函数以应用不同的折扣策略
virtual double net_price(size_t n) const
{
return n*price;
}
virtual Item_base* clone() const
{
return new Item_base(*this);
}
virtual ~Item_base(){}
private:
std::string isbn;
protected:
double price;
};
//保存折扣率和可执行折扣策略的数量
//派生类将使用这些数据实现定价策略
class Disc_item : public Item_base{
public:
Disc_item(const std::string& book = " ",
double sales_price =0.0,
size_t qty=0,double disc_rate=0.0):
Item_base(book,sales_pirce),
quantity(qty),disount(disc_rate){ }
double net_price(size_t) const =0;
std::pair <size_t,double> discount_policy() const
{
return std::make_pair(quantity,discount);
}
protected:
size_t quantity; //可实行折扣策略的购买量
double discount; //折扣率
};
//批量购买折扣类
class Bulk_item : public Disc_item{
public:
Bulk_item(const std::string& book = " ",
double sales_price =0.0,
size_t qty=0,double disc_rate=0.0):
Disc_item(book,sales_pirce,qty,disc_rate){}
//重定义基类版本以实现批量购买折扣类:
//若购书量高于下限,则使用折扣价格
double net_price(size_t cnt) const
{
if(cnt > = quantity)
return cnt*(1-discount)*price;
else
return cnt*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,
size_t qty =0,double disc_rate =0.0):
Disc_item(book,sales_price,qty,disc_rate){ }
//重定义基类版本以实现有限折扣策略:
//对低于上限的购书量使用折扣价格
double net_price(size_t cnt) const
{
if(cnt <= quantity)
return cnt*(1-discount)*price;
else
return cnt*price - quantity *discount *price;
}
virtual Lds_item* clone() const
{
return new Lds_item(*this);
}
};
#endif
---------------------
//main程序
#include "Basket.h "
#include "Sales_item.h "
#include <iostream>
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 ",99,20,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 < <basket.total() < <endl;
return 0;
}
------------------------------
//Sales_item.h
#ifndef SALESITEM_H
#define SALESITEM_H
#include <stdexcept>
#include "Item.h "
class Sales_item{
public:
//默认构造函数:创建未绑定的句柄
Sales_item():p(0),use(new std::size_t(1)){ }
//将创建绑定到Item_base对象副本的句柄
Sales_item(const Item_base& item):
p(item.clone()),use(new std::size_t(1)){ }
//复制控制成员管理使用计数和指针
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-> complex() 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; //指向共享Item_base对象的指针
std::size_t *use; //指向共享的使用计数的指针
//为析构函数和赋值操作符所用的辅助函数
void decr_use()
{
if(--*use==0){
delete p;
delete use;
}
}
};
#endif
-------------------------------
//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;
}
-----------------------------
完。一共6个文件放一个工程里。
Basket.h,Basket.cpp,Item.h,main1535.cpp,Sales_item.h,Sales_item.cpp
用的是dev--编译器。
[解决办法]
C++ Primer都有配套习题解答的,买本吧。