Iterator (C++实现)

来源:互联网 发布:安禄山 知乎 编辑:程序博客网 时间:2024/04/30 18:41

// Iterator.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

typedef int DATA;

class Iterator;

class Aggregate
{
public:
 Aggregate()
 {
 }

 virtual ~Aggregate()
 {
 }

 virtual Iterator* CreateIterator()=0;
 virtual int GetSize()=0;
 virtual DATA GetItem(int index)=0;

};

class Iterator
{
public:
 Iterator()
 {}
 virtual~ Iterator()
 {}

 virtual void First()=0;
 virtual void Next()=0;
 virtual bool IsDone()=0;
 virtual DATA CurrentItem()=0;
};

class ConcreteIterator:public Iterator
{
public:
  ConcreteIterator(Aggregate* p):m_pConcreteAggregate(p),m_index(0)
  {

  }
  virtual ~ConcreteIterator()
  {
  
  }
   
  virtual void First()
  {
   m_index=0;
  }
  virtual void Next()
  {
   if(m_index<m_pConcreteAggregate->GetSize() )
   {
    m_index++;
      }
  }
  virtual bool IsDone()
  {
   return m_index==m_pConcreteAggregate->GetSize();
  }
  virtual DATA CurrentItem()
  {
   return m_pConcreteAggregate->GetItem(m_index);
  }

private:
 Aggregate * m_pConcreteAggregate;
 int m_index;

};
class ConcreteAggregate:public Aggregate
{
public:
 ConcreteAggregate(int size):m_size(size)
 {
  m_pData=new DATA[m_size];
  for(int i=0;i<m_size;i++)
  {
   m_pData[i]=i;
  }
 }
 virtual ~ ConcreteAggregate()
 {
  delete []m_pData;
  m_pData=NULL;

 }

 virtual Iterator* CreateIterator()
 {
  return new ConcreteIterator(this);
 }

 virtual int GetSize()
 {
  return m_size;
 }

 virtual DATA GetItem(int index)
 {
  if(index<m_size)
  {
   return m_pData[index];
  }
  else
  {
   return -1;
  }
 }

private:
 int m_size;
 DATA *m_pData;

};


int _tmain(int argc, _TCHAR* argv[])
{
 Aggregate * pAggregate=new ConcreteAggregate(10);
 Iterator * pIterator=pAggregate->CreateIterator();
 for(;false==pIterator->IsDone();pIterator->Next())
 {
  cout<<pIterator->CurrentItem()<<endl;
 }
 return 0;
}

 

原创粉丝点击