zoukankan      html  css  js  c++  java
  • 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源代码里好多都是这样实现的

  • 相关阅读:
    C
    A
    G
    B
    一些新玩意:
    Angular常用功能
    node学习笔记(四)
    node学习笔记(三)
    node学习笔记(二)
    node学习笔记
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5155151.html
Copyright © 2011-2022 走看看