首页 > 代码库 > Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of
Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
经验:在应用域,复合意味着 has-a。 在实现域,复合意味着 is-implemented-in-terms-of
示例:
template<typename T> //将list应用于 Set。错误做法 class Set: public std::list<T> {...};
解析:
public 继承表示 is-a,即如果D是一种B,对B为真的每一件事,对D也应该为真。但list可以包含相同的元素,而Set不可以
纠正:
template<typename T> class Set{ public: bool member(const T &item) const; void insert(const T &item); void remove(const T &item); std::size_t size() const; private: std::list<T> rep; //用来表述Set的数据 }; template<typename T> bool Set<T>::member(const T &item) const { return std::find(rep.begin(). rep.end(), item) != rep.end(); } template<typename T> void Set<T>::insert(const T &item){ if(!member(item)) rep.push_back(item); } template<typename T> void Set<T>::remove(const T &item){ typename std::list<T>::iterator it = std::find(rep.begin(), rep.end(), item); //用 typename 标志嵌套从属类型名称 ?我以前没写 typename 好像也没出现什么问题 if(it != rep.end()) rep.erase(it); } template<typename T> std::size_t Set<T>::size() const{ return rep.size(); }
解析:
在STL源码里好多都是这样实现的
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。