MyException - 我的异常网
当前位置:我的异常网» C++ » 生手交作业 C++ Primer中文第四版第15章

生手交作业 C++ Primer中文第四版第15章

www.MyException.Cn  网友分享于:2013-01-24  浏览:5次
新手交作业 C++ Primer中文第四版第15章
这作业是我根据书本知识,参考少数书本内容,绝大多数自己写的。
主要是建立书本销售的类及其派生类(Item_base与Bulk_item)。然后建立句柄类(Sales_item),及使用句柄类的类(Basket)。


#include <string>
#include <cstddef>
#ifndef ITEM_BASE_H
#define ITEM_BASE_H
class Item_base
{
public:
Item_base(): price(0.0), count(0) {}
Item_base(double, std::size_t, const std::string&);
virtual Item_base* clone() const
{ return new Item_base(*this); }
virtual double TotlePrice(std::size_t sold) const
{ return price * sold; }
const std::string& GetBook() const
{ return isbn; }
private:
size_t count;
std::string isbn;
double price;
};
#endif



#include "Item_base.h"
#include <string>
#include <cstddef>
#ifndef BULK_ITEM_H
#define BULK_ITEM_H
class Bulk_item : public Item_base
{
public:
Bulk_item(): Item_base() {}
Bulk_item(double, std::size_t, const std::string&);
Bulk_item* clone() const
{ return new Bulk_item(*this); }
double TotlePrice(std::size_t) const;
};
#endif



#include "Item_base.h"
#include <cstddef>

#ifndef SALES_ITEM_H
#define SALES_ITEM_H
class Sales_item
{
public:
Sales_item(): p(0), use(new std::size_t(1)) {}
Sales_item(const Item_base&);
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->() 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 == 0) { delete p; delete use; } }
};
#endif



#include <set>
#include "Sales_item.h"

#ifndef BASKET_H
#define BASKET_H
inline bool compare(const Sales_item &lhs, const Sales_item &rhs)
{ return lhs->GetBook() < rhs->GetBook(); }
class Basket
{
typedef bool (*Comp) (const Sales_item&, const Sales_item&);
public:
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



#include "Item_base.h"
#include <string>
#include <cstddef>

Item_base::Item_base(double BookPrice, std::size_t sold, const std::string &BookName):

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有