// example9.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "string.h" //定义一个学生类 class CStudent { public: CStudent() { m_number = 0; memset(m_name, 0, 10); }; CStudent(int number, char* name) { m_number = number; strcpy_s(m_name, 10, name); }; ~CStudent(){}; void output() { printf("number=%d name=%s\n", m_number, m_name); }; public: int m_number; char m_name[10]; }; //定义一个接口类,完成对迭代器的抽象定义 //为了对迭代器的访问,定义函数指针 class Iterator; typedef void (*Visit)(Iterator*); class Iterator { public: virtual void first()=0; virtual void next()=0; virtual bool isend()=0; virtual void output()=0; virtual void use(Visit visit)=0; }; //定义一个聚合抽象类,包含一个抽象迭代器 class Agressgate { public: virtual Iterator* createIterator()=0; virtual int getsize()=0; virtual void output(int index)=0; virtual Iterator* getitem(int index)=0; }; //实现真正的迭代器 class ConcreteIterator: public Iterator { public: ConcreteIterator(Agressgate* pAgressgate) { m_pAgressgate = pAgressgate; m_index = 0; }; void first() //指向第一个原色 { m_index = 0; }; void next() //游标自动前进一个 { m_index++; }; bool isend() //判断是否已经到了聚合类最后一个元素 { return (m_index == m_pAgressgate->getsize()); }; void output() { m_pAgressgate->output(m_index); }; void use(Visit visit) { visit(m_pAgressgate->getitem(m_index)); }; private: Agressgate* m_pAgressgate; //聚合类的指正 int m_index; //真正的迭代器游标 }; //实现真正的聚合类 class ConcreteAggressgate: public Agressgate { public: ConcreteAggressgate() { m_currentpos = 0; }; ~ConcreteAggressgate(){}; public: Iterator* createIterator() { return new ConcreteIterator(this); }; int getsize() { return m_currentpos; }; void insert(CStudent stu) { if (m_currentpos < 100) { m_studentlist[m_currentpos] = stu; m_currentpos++; } }; void output(int index) { m_studentlist[index].output(); }; Iterator* getitem(int index) { return (Iterator*)&m_studentlist[index]; }; private: CStudent m_studentlist[100]; //聚合类的存储方式采用数组 int m_currentpos; //聚合类目前存储元素的个数 }; //为了测试迭代器 void print(Iterator* LI) { CStudent* pstu = (CStudent*)LI; pstu->output(); } void swap(char* a, char* b) { char temp = *a; *a = *b; *b = temp; } void conversestring(char* str) { int length = strlen(str); for(int i = 0; i < length / 2; i++) { swap( str + i, str + length - i - 1); } } //为了测试迭代器 void conversename(Iterator* LI) { CStudent* pstu = (CStudent*)LI; conversestring(pstu->m_name); } int _tmain(int argc, _TCHAR* argv[]) { ConcreteAggressgate studentlist; CStudent stu1(1, "abcd"); studentlist.insert(stu1); CStudent stu2(2, "asdf"); studentlist.insert(stu2); CStudent stu3(3, "54321"); studentlist.insert(stu3); Iterator* LI = studentlist.createIterator(); LI->first(); while(!LI->isend()) { LI->use(print); LI->use(conversename); LI->output(); LI->next(); } getchar(); return 0; }