Код: Выделить всё
TContaner c1, c2;
TContaner::itterator Itterator;
...
Itterator=c2.Begin();
++Itterator;
c1.Insert(Itterator, 21);
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Код: Выделить всё
TContaner c1, c2;
TContaner::itterator Itterator;
...
Itterator=c2.Begin();
++Itterator;
c1.Insert(Itterator, 21);
. Ну и где здесь в итераторе инфа о контейнере?Код: Выделить всё
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; };
Ровно столько же. О том, что речь о какой то реализации в одной из моих тем, как раз было понятно и так. Вот только ни в одной из них мне не попадались реализации с указанной особенностью.Писал бы о самописном классе с итератором в одной теме - было бы понятно по контексту о какой реализации речь.
Код: Выделить всё
class TList
{
public:
class TItem;
class Iterator
{
private:
friend class TList;
friend class TItem;
TList *Owner;
TItem *Pointer;
Iterator (TList *Owner, TItem *Pointer)
{
this->Owner =Owner;
this->Pointer=Pointer;
}
public:
Iterator ()
{
Owner =nullptr;
Pointer=nullptr;
}
Iterator operator ++()
{
if (Owner==nullptr)
{
throw;
}
if (Pointer!=nullptr)
{
Pointer=Pointer->Next;
}
return *this;
}
int &operator * ()
{
if (Owner==nullptr)
{
throw;
}
if (Pointer==nullptr)
{
throw;
}
return Pointer->Data;
}
bool operator != (const Iterator &Right)
{
if ((Owner==nullptr)||(Right.Owner==nullptr))
{
throw;
}
return ((Owner==Right.Owner)&&(Pointer!=Right.Pointer));
}
};
class TItem
{
friend class TList;
friend class Iterator;
private:
TItem *Next;
public:
int Data;
};
private:
TItem *First;
TItem *Last;
public:
TList()
{
First=nullptr;
Last =nullptr;
}
~TList()
{
TItem *Next;
for (Next=First->Next; Next!=nullptr; First=Next, Next=First->Next)
{
delete First;
}
Last=nullptr;
}
Iterator Insert (const Iterator &After, const int &Data)
{
TItem *Item;
if (After.Owner==nullptr)
{
throw;
}
if (After.Owner!=this)
{
throw;
}
Item=new TItem;
Item->Data=Data;
if (After.Pointer==nullptr)
{
if (Last!=nullptr)
{
Last->Next=Item;
}
Last=Item;
Item->Next=nullptr;
}
if (First==nullptr)
{
First=Item;
}
return Iterator(this, Item->Next);
}
Iterator Begin()
{
return Iterator(this, First);
}
Iterator End ()
{
return Iterator(this, nullptr);
}
Iterator Find(const int &Value)
{
TItem *Item;
for (Item=First; Item!=nullptr; Item=Item->Next)
{
if ((Item->Data)==Value)
{
return Iterator(this, Item);
}
}
return Iterator(this, nullptr);
}
};
Да, действительно нет. Значит мне показалось.Сионист писал(а):Ну и где здесь в итераторе инфа о контейнере?
Можно сделать свой класс-исключение и везде бросать его. Класс сделать вложенным, как и класс-итератор. WinMain уже давал пример, в котором был объявлен класс-исключение, который наследовался от std::exception.Сионист писал(а):Что именно бросать в каждом случае
Код: Выделить всё
TList *const Owner;