坐火车了,不学了,今天的绝笔。。。。。。
====================================================================================================================================
接上边,因为容器管理对象太麻烦,存基类和派生类都不好,指针不好管理,所以要用handle类来管理,BTW:程序里用购物篮(shopping)basket,不叫购物车,不过ebay上购物车是cart,
关于比较:
review: operator< and operator== 两者的冲突~小于只是isbn相同,euqal却要求所有成员相同,会产生歧义
review:默认实参和函数重载也有点微妙的关系,有时候还有那么点像,不过有默认实参的时候,实参必须要严格遵守顺序,比如第一个只能是isbn,当然,重载就高级了,第一个是price也无所谓。
现在要使用的方法就是:定义容器的时候可以比较器一块弄进去
std::multiset<Sales_item, Comp> items(compare);
这个类里边的
typedef bool (*Comp)(const Sales_item&, const Sales_item&);
困惑一:
这里边的typedef,后边没跟东西,新名字是什么?
困惑二,直接用这个compare定义也匹配不上
review一下函数指针吧:
inline bool compare(const Sales_item& lhs, const Sales_item& rhs){
return lhs->book() < rhs->book();
}
附加疑问,这个book()函数,直接要求是Item_base成员。(因为自定义操作符Item_base* operator->)
定义一个Basket类
class Basket {
//type of the comparison function used to order the multiset
typedef bool (*Comp)(const Sales_item&, const Sales_item&);//这个比较器是自己调用才有效,还是容器自己也用他排序?还有这个typedef成什么了
public:
//make it easier to type the type of our set
typedef std::multiset<Sales_item, Comp> set_type;
//typedefs modeled after corresponding container types
typedef set_type::size_type size_type;
typedef set_type::const_iterator const_iter;
Basket() : items(compare) { } //initialze the comparator
void add_item(const Sales_item &item){
items.insert(item); }
size_type size(const Sales_item &i) const { //item_count功能
return items.count(i); }
double total() const; //sum of net prices for all items in the basket
private:
std::multiset<Sales_item, Comp> items;
};
double Basket::total() const {
double sum = 0.0;
for(const_iter iter = items.begin();iter != iterm.end();iter = items.upper_bound(*iter)){
sum += (*iter) -> net_price(items.count(*iter));
}
return sum;
}
to be continued ...