编写C++ Primer书上的 一个句柄类的例子运行时出错,请各位好心的大侠帮帮忙
程序代码如下:
定义一个包含类定义的头文件head1
#ifndef HEAD1_H
#define HEAD1_H
#include <iostream>
//不适用折扣策略的基类
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()
{
std::cout<<"Destroy!"<<std::endl;
}
virtual Item_base* clone() const
{
return new Item_base(*this);
}
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_price),quantity(qty),discount(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_price,qty,disc_rate){}
double net_price(size_t cnt) const
{
if (cnt>=quantity)
{
return cnt*(1-discount)*price;
}
else
return cnt*price;
}
};
//有限折扣类
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;
}
};
class Sales_item //创建的句柄类
{
public:
Sales_item():p(0),use(new size_t(1)){}
Sales_item(Item_base& it):p(&it),use(new size_t(1)){}
Sales_item(const Sales_item& i):p(i.p),use(i.use)
{
++*use;
}
~Sales_item()
{
decr_use();
}
Sales_item& operator=(Sales_item& rhs)
{
++rhs.use;
decr_use();
p=rhs.p;
use=rhs.use;
return *this;
}
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;
size_t *use;
void decr_use()
{
if (--*use==0)
{
delete use;
delete p; //貌似此处有问题
}
}
};
#endif
主函数main如下
int main()
{
Item_base Item("I am Sam",70.0);
Bulk_item Bulk("I am Sam",70.0,5,0.1);
Sales_item Sales_I(Item);
cout<<Sales_I->net_price(10)<<endl;
Sales_item Sales_B(Bulk);
cout<<Sales_B->net_price(10)<<endl;
return 0;
}
编译通过,但是运行的时候提示错误,感觉好像是指针哪里有问题,调试的时候在delete p处出错,去掉这句话就运行正常,小弟新手,请高手帮忙