15.8节练习

练习15.28 定义一个存放Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素的net_price。

#include <iostream>
#include <vector>
#include "Quote.h"
using namespace std;
int main()
{
	vector<Quote> Qvec;
	Bulk_Quote b1("c++", 90, 5, 0.1);
	Bulk_Quote b2("c", 50, 5, 0.1);
	Qvec.push_back(b1);
	Qvec.push_back(b2);
	double sum = 0.0;
	for (auto &i : Qvec) {
		sum += i.net_price(10);
	}
	cout << sum << endl;
}

调用的是Quote中的net_price版本,不打折的。


15.29 再运行一次你的程序,这次传入Quote对象的shared_ptr。如果这次计算出的总额与之前的程序不一致,解释为什么,如果一致,也请说明理由。

#include <iostream>
#include <vector>
#include <memory>
#include "Quote.h"
using namespace std;
int main()
{
	vector<shared_ptr<Quote>> basket;
	auto p1 = make_shared<Bulk_Quote> ("c++", 90,5,0.1);
	auto p2 = make_shared<Bulk_Quote>("c", 50, 5, 0.1);
	basket.push_back(p1);
	basket.push_back(p2);
	double sum = 0.0;
	for (auto &i : basket) {
		sum += i->net_price(10);
	}
	cout << sum << endl;
}
此次调用的是Bulk_quote中的net_price版本。


练习15.30 编写你自己的Baseket类,用它计算上一个练习中交易记录的总价格。

#include <iostream>
#include <memory>
#include <set>
#include "Quote.h"
using namespace std;
class Basket {
public:
	double total_recepit(std::ostream &)const;
	void add_item(const Quote &sale) { items.insert(std::shared_ptr<Quote>(sale.clone())); }
	void add_item(Quote &&sale) { items.insert(std::shared_ptr<Quote>(sale.clone())); }
private:
	static
	bool compare(const std::shared_ptr<Quote> &lhs, const std::shared_ptr<Quote> &rhs)
	{
		return lhs->isbn() < rhs->isbn();
	}
	std::multiset<shared_ptr<Quote>, decltype(compare)*> items{ compare };
};

double Basket::total_recepit(std::ostream &os)const
{
	double sum = 0.0;
	for (auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter)) {
		sum += print_total(os, **iter, items.count(*iter));
	}
	os << "Total Sale: " << sum << endl;
	return sum;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值