辅助替换指针的类

文章讲述了如何在C++中使用`std::shared_ptr`和多态性设计一个Basket类,通过`clone`方法处理动态内存,并演示了如何通过虚函数解决类型识别问题以及计算总价的方法total_receipt。
#pragma once
#include <iostream>
#include <set>

class Basket
{
public:
	//Basket使用合成的默认构造函数和拷贝控制成员
	void add_item(const std::shared_ptr<Quote>& sale) {
		items.insert(sale);
	}
	//由于上面的添加元素函数,用户仍然必须处理动态内存,进而改正
	//使用虚函数解决类型识别问题
	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>(std::move(sale).clone()));//尽管sale是一个右值引用类型,但实际上sale本身是一个左值。(变量为左值)
	}
	//打印每本书的总价和购物篮中所有书的总价
	double total_receipt(std::ostream&) const;
private:
	//该函数用于比较shared_ptr,multiset成员会用到它
	static bool compare(const std::shared_ptr<Quote>& lhs, const std::shared_ptr<Quote>& rhs) {
		return lhs->isbn() < rhs->isbn();
	}
	//multiset保存同一本书的多个报价,按照compare成员排序
	//shared_ptr没有定义小于运算符,必须提供自己的比较运算符
	std::multiset<std::shared_ptr<Quote>, decltype(compare)*> items{compare};//初始化items并令其使用compare函数
};

class Quote {
public:
	//该虚函数返回当前对象的一份动态分配的拷贝
	virtual Quote* clone() const& {
		return new Quote(*this);
	}
	virtual Quote* clone()&& {
		return new Quote(std::move(*this));
	}
};

class Bule_quote : public Quote {
public:
	//该虚函数返回当前对象的一份动态分配的拷贝
	virtual Bule_quote* clone() const& {
		return new Bule_quote(*this);
	}
	virtual Bule_quote* clone()&& {
		return new Bule_quote(std::move(*this));
	}
};
#include "Basket.h"

double Basket::total_receipt(std::ostream& os) const
{
    double sum = 0.0;
    for (auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter)) {//upper_bound返回一个第一个大于*iter元素的迭代器
        sum += print_total(os, **iter, items.count(*iter));
    }
    os << "Total Sale: " << sum << std::endl;
    return sum;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值