#include "abstract_iterator.h" #include "stl_vector.h" template abstract_iterator_impl::iterator>; //===================================================================================== static void printint(const int & i) { printf("%d,",i); } class AbstractIntContainer { public : virtual ~AbstractIntContainer() { } virtual abstract_iterator begin() = 0; virtual abstract_iterator end() = 0; protected: AbstractIntContainer() { } private: FORBID_CLASS_STANDARDS(AbstractIntContainer); }; AbstractIntContainer * AIC_factory(); void abstract_iterator_test() { AbstractIntContainer * aic = AIC_factory(); abstract_iterator first = aic->begin(); abstract_iterator last =aic->end(); std::for_each(first,last,printint); puts("X"); std::sort(first,last); std::for_each(first,last,printint); puts("X"); delete aic; } //===================================================================================== class AbstractIntContainerImpl : public AbstractIntContainer { public : AbstractIntContainerImpl() { } typedef std::vector veci; typedef abstract_iterator_impl abit; abstract_iterator begin() { return abstract_iterator( new abit( m_vec.begin() ) ); } abstract_iterator end() { return abstract_iterator( new abit( m_vec.end() ) ); } veci m_vec; private: FORBID_CLASS_STANDARDS(AbstractIntContainerImpl); }; AbstractIntContainer * AIC_factory() { AbstractIntContainerImpl * aic = new AbstractIntContainerImpl(); aic->m_vec.push_back(3); aic->m_vec.push_back(7); aic->m_vec.push_back(4); return aic; } //=====================================================================================