迭代器模式.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;
}