2010年1月5日 星期二

TuComposite - Template of Composite pattern

// allows a group of objects to be treated in the same way as a single instance of an object.

//
TuComposite<CuMyObject> myComposite;
CuMyObject *pMyObject = &myComposite;

//
class CuMyCompositeObject : public TuComposite<CuMyObject> 
{
    ...
};

// TuComposite.h


template <typename T>
class TuComposite : public T
{
protected:
    vector<T*> _itsElement;
    typename vector<T*>::iterator _itor; 
    
public:

    TuComposite(){};
    virtual ~TuComposite(){};

    void push_back(T *pElement){ _itsElement.push_back(pElement); }
    void insert(int n, T *pElement){ _itsElement.insert(_itsElement.begin() + n, pElement); }

    T* at(const int nIndex){ return _itsElement[nIndex]; }
    void reserve( int _Count ){_itsElement.reserve(_Count); }

    int size(){ return _itsElement.size(); }
    
    void remove(T *pElement);
    void clear();
    
    
};

template <typename T>
void TuComposite<T>::clear()
{
    
    _itor = _itsElement.begin();
    
    while(  _itor != _itsElement.end() )
    {
        
        T* pElement = *_itor;
        delete pElement;
        _itor++;
        
    }
    
    _itsElement.clear();
    
}

template <typename T>
void TuComposite<T>::remove(T *pElement)
{
    
    _itor = _itsElement.begin();
    
    while(  _itor != _itsElement.end() )
    {
        
        if( pElement == *_itor )
        {
            _itsElement.erase(_itor);
            break;
        }
        _itor++;
        
    }
    
}

1 則留言:

  1. 在這裡沒打算繼承 vector, 在沒有多型需求下, 不考慮使用繼承!

    回覆刪除