прикрутить исключение разыменовании иттератора, равного sl.End()? Здесь:Код: Выделить всё
class TSimpleList { public: class Node { public: Node(): Prev(nullptr), Next(nullptr) { } Node *Prev; Node *Next; }; class Iterator { public: Iterator() : m_node(nullptr) { } Iterator(Node *n) { m_node = n; } void operator++() { if (m_node != nullptr) { m_node = m_node->Next; } } bool operator!=(const Iterator& it) { return (m_node != it.m_node); } private: Node *m_node; }; TSimpleList() : m_pBegin(&m_end) { } ~TSimpleList() { // удаление элементов списка while (m_end.Prev != nullptr) { Node *Last = m_end.Prev; m_end.Prev = Last->Prev; delete Last; } } Iterator Begin() { return m_pBegin; } Iterator End() { return &m_end; } void Add() { if (&m_end != m_pBegin) { Node *it = new Node(); Node *Last = m_end.Prev; Last->Next = it; m_end.Prev = it; it->Next = &m_end; } else { m_pBegin = new Node(); m_pBegin->Next = &m_end; m_end.Prev = m_pBegin; } } private: Node m_end; Node* m_pBegin; }; int tmain() { TSimpleList sl; TSimpleList::Iterator it; sl.Add(); sl.Add(); sl.Add(); for (it = sl.Begin(); it != sl.End(); ++it) { _puttch('.'); } _gettch(); return 0; }
Код: Выделить всё
class TList
{
public:
class TItem;
class itterator
{
private:
friend class TList;
friend class TItem;
TItem *Pointer;
itterator (TItem *Pointer)
{
this->Pointer=Pointer;
}
public:
itterator ()
{
Pointer=nullptr;
}
itterator operator ++()
{
if (Pointer!=nullptr)
{
Pointer=Pointer->Next;
}
}
int &operator * ()
{
return Pointer->Data;
}
bool operator != (const itterator &Right)
{
return (Pointer!=Right.Pointer);
}
};
class TItem
{
friend class TList;
friend class TItterator;
private:
TItem *Next;
public:
int Data;
};
private:
TItem *Start;
TItem *Last;
public:
TList()
{
Start=nullptr;
Last =nullptr;
}
~TList()
{
TItem *Next;
for (Next=Start->Next; Next!=nullptr; Start=Next, Next=Start->Next)
{
delete Start;
}
Last=nullptr;
}
itterator Insert(const itterator &Itterator, const int &Data)
{
TItem *Item;
Item=new TItem;
Item->Data=Data;
if (Itterator.Pointer==nullptr)
{
if (Start==nullptr)
{
Start=Item;
Last =Item;
}
else
{
Last->Next=Item;
Last=Item;
}
Item->Next=nullptr;
}
else
{
Item->Next=Itterator.Pointer->Next;
Itterator.Pointer->Next=Item;
}
return itterator(Item->Next);
}
itterator Begin()
{
return itterator(Start);
}
itterator End ()
{
return itterator(nullptr);
}
};