#include #include using namespace std; template class Iterator; // Forward declaration template class Container { T array[size]; public: friend class Iterator; }; template class Iterator { Container& ref; int index; public: Iterator(Container& cr) : ref(cr), index(0) {} void reset() { index = 0; } // prefix increment operator Iterator& operator++() { if(index < size - 1) index++; else index = size; return *this; // indicates end of list } // dereferencing operator T& operator*() { return ref.array[index]; } // conversion operator operator bool() const { return index < size; } }; class X { int i; public: X(int I = 0) : i(I) {} X& operator=(const int& I) { i = I; return *this; } friend ostream& operator<<(ostream& out, const X& object) { out << object.i; return out; } }; class Fraction { int numer, denom; public: Fraction(int n = 0, int d = 1) : numer(n),denom(d) {} Fraction& operator=(const Fraction& f) { numer = f.numer; denom = f.denom; return *this; } friend ostream& operator<<(ostream& out, const Fraction& object) { out << object.numer << '/' << object.denom; return out; } }; class Card { private: int pips, suit; static const string SuitName[4]; static const string PipsName[13]; public: Card(int n = 0) : pips(n%13), suit(n/13) {} Card& operator=(const Card& c) { pips = c.pips; suit = c.suit; return *this; } friend ostream& operator<<(ostream& out, const Card& object) { out < xC; Iterator iX(xC); for(auto i = 0; i < 7; i++) { *iX = i; ++iX; } iX.reset(); do cout << *iX << endl; while(++iX); Container fractionContainer; Iterator fractionIterator(fractionContainer); for(auto i = 0; i < 3; i++) { *fractionIterator = Fraction(i+1,i+2); ++fractionIterator; } fractionIterator.reset(); do cout << *fractionIterator << endl; while(++fractionIterator); Container CardC; Iterator itCard(CardC); for(auto i = 0; i < 5; i++) { *itCard = Card(3*i+5); ++itCard; } itCard.reset(); do cout << *itCard << endl; while(++itCard); }