首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

primer4ed中习题15.35有哪位高手编译通过了

2012-03-11 
primer4ed中习题15.35有谁编译通过了?c++primer第四版习题15.35------------------//Basket.h#ifndefBASKE

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都有配套习题解答的,买本吧。

热点排行