迭代器模式.cpp
# include <iostream>
# include <vector>
# include <list>
# include <memory>
using namespace std;
namespace ns1
{ template < typename T > class myIter { public : virtual ~ myIter ( ) { } virtual void First ( ) = 0 ; virtual void Next ( ) = 0 ; virtual bool IsDone ( ) = 0 ; virtual T & CurrentItem ( ) = 0 ; } ; template < typename T > class myCotainer { public : virtual ~ myCotainer ( ) { } virtual shared_ptr< myIter< T>> CreateIterator ( ) = 0 ; virtual T & getItem ( int index) = 0 ; virtual int getSize ( ) const = 0 ; } ; template < typename T > class myVectorIter : public myIter < T > { myCotainer< T> * myvector; int m_current; public : myVectorIter ( myCotainer< T> * tmpc) : myvector ( tmpc) , m_current ( 0 ) { } void First ( ) override { m_current = 0 ; } void Next ( ) override { m_current++ ; } bool IsDone ( ) override { return m_current >= myvector-> getSize ( ) ; } T & CurrentItem ( ) override { return myvector-> getItem ( m_current) ; } } ; template < typename T > class myVector : public myCotainer < T > { private : T m_elem[ 10 ] ; public : myVector ( ) { for ( int i = 0 ; i < 10 ; ++ i) m_elem[ i] = i; } shared_ptr< myIter< T>> CreateIterator ( ) override { return make_shared < myVectorIter< T>> ( this ) ; } T & getItem ( int index) override { return m_elem[ index] ; } int getSize ( ) const override { return 10 ; } } ;
} int main ( )
{
# if 0 vector< int > msgVector; msgVector. push_back ( 1 ) ; msgVector. push_back ( 2 ) ; msgVector. push_back ( 3 ) ; for ( vector< int > :: const_iterator pos = msgVector. cbegin ( ) ; pos != msgVector. cend ( ) ; ++ pos) cout << * pos << endl; cout << "-------------------" << endl; list< int > msgList; msgList. push_back ( 1 ) ; msgList. push_front ( 2 ) ; msgList. push_back ( 3 ) ; for ( list< int > :: const_iterator pos = msgList. cbegin ( ) ; pos != msgList. cend ( ) ; ++ pos) cout << * pos << endl;
# endif # if 0 using namespace ns1; shared_ptr< myCotainer< int >> pcontainer ( new myVector < int > ( ) ) ; shared_ptr< myIter< int >> iter ( pcontainer-> CreateIterator ( ) ) ; for ( iter-> First ( ) ; ! iter-> IsDone ( ) ; iter-> Next ( ) ) cout << iter-> CurrentItem ( ) << endl;
# endif # if 1 using namespace ns1; shared_ptr< myCotainer< int >> pcontainer ( new myVector < int > ( ) ) ; myVectorIter< int > iter ( pcontainer. get ( ) ) ; for ( iter. First ( ) ; ! iter. IsDone ( ) ; iter. Next ( ) ) cout << iter. CurrentItem ( ) << endl;
# endif cout << "Over!\n" ; return 0 ;
}