由于一个容器只能保存一种类型,所以对于继承的类,需要间接保存,存放指针而不是对象
编写basket类
class Basket { public: void add_item(const std::shared_ptr<Quote> &sale) { items.insert(sale); } double total_receipt(std::ostream&) const; private: static bool compare(const std::shared_ptr<Quote> &lhs, const std::shared_ptr<Quote> &rhs) {return lhs->isbn() < rhs->isbn();} std::multiset<std::shared_ptr<Quote>, decltype(compare)*> items{compare}; }; double Basket::total_receipt(ostream &os) const { double sun = 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; }
利用虚拷贝隐藏指针
class Quote { public: virtual Quote* clone() const & {return new Quote(*this);} virtual Quote* clone() const && {return new Quote(std::move(*this));} } //派生类也如此定义 ...
新版本的add_item可以这样写
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())); }