码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of

时间:2014-07-12 23:02:43      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   数据   问题   

本文为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源码里好多都是这样实现的

Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of,布布扣,bubuko.com

Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of

标签:style   blog   http   color   数据   问题   

原文地址:http://blog.csdn.net/zhengsenlie/article/details/37724037

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!