新手交作业 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):
price(BookPrice), count(sold), isbn(BookName) {}
#include "Bulk_item.h"
#include "Item_base.h"
#include <string>
#include <cstddef>
Bulk_item::Bulk_item(double BookPrice, std::size_t sold, const std::string &BookName):
Item_base(BookPrice, sold, BookName) {}
double Bulk_item::TotlePrice(std::size_t sold) const
{
double totle = Item_base::TotlePrice(sold);
if (sold <= 5)
return totle * 0.8;
else if (sold > 5 && sold <= 10)
return totle * 0.7;
else if (sold > 10 && sold <= 20)
return totle * 0.6;
else
return totle * 0.5;
}
#include "Sales_item.h"
#include "Item_base.h"
#include <cstddef>
Sales_item& Sales_item::operator=(const Sales_item &is)
{
++*is.use;
decr_use();
p = is.p;
use = is.use;
return *this;
}
Sales_item::Sales_item(const Item_base &ibis):
p(ibis.clone()), use(new std::size_t(1)) {}#include "Sales_item.h"
#include "Item_base.h"
#include <cstddef>
Sales_item& Sales_item::operator=(const Sales_item &is)
{
++*is.use;
decr_use();
p = is.p;
use = is.use;
return *this;
}
Sales_item::Sales_item(const Item_base &ibis):
p(ibis.clone()), use(new std::size_t(1)) {}
#include "Basket.h"
double Basket::total() const
{
double sum = 0.0;
for (Basket::const_iter iter = items.begin();
iter != items.end();
iter = items.upper_bound(*iter))
//sum += (*(*iter)).TotlePrice(6);
sum += (*iter)->TotlePrice(items.count(*iter));
return sum;
}
#include "Item_base.h"
#include "Bulk_item.h"
#include "Sales_item.h"
#include "Basket.h"
#include <iostream>
#include <string>
#include <cstddef>
using namespace std;
int main()
{
Item_base book1(37.0, 100, "C++");
Bulk_item book2(28.0, 50, "Class");
Sales_item S1(book1), S2(book2), S3;
Basket MyBooks;
cout << "你想买书吗?这里有:\n1、C++(37元/本), 2、Class(28元/本,量大优惠)" << endl;
while (true)
{
cout << "请输入你想买的书名和数量:" << endl;
string BookName;
size_t BookNum;
cin >> BookName >> BookNum;
if (BookName == "C++"){
for (size_t i = 0; i != BookNum; ++i)
{
S3 = S1;
MyBooks.add_item(S3);
}
}
else if (BookName == "Class"){
for (size_t i = 0; i != BookNum; ++i)
{
S3 =S2;
MyBooks.add_item(S3);
}
}
else {
cout << "你输入不正确!" << endl;
continue;
}
cout << "你还想再购买吗?(继续请输入y)" << endl;
char NextBuy;
cin >> NextBuy;
if (NextBuy == 'y')
continue;
cout << "你购买的书本总数是:\n"
<< "C++:" << MyBooks.size(S1) << "\t"
<< "Class:" << MyBooks.size(S2) << "\n"
<< "你所购买的书的总价是:"
<< MyBooks.total() << endl;
break;
}
return 0;
}
[解决办法]
你想问什么哦?
[解决办法]
smart pointer
[解决办法]
那不是重载过吗