Перегрузка операторов при использовании итератора структуры
Разрабатываю структура двусвязного списка на основе адресных указателей. Также в задание входит разработка собственного класса итератора для структуры. Итератор имеет набор стандартных операций со структурой, в том числе стандартные перегрузки. Проблема заключается именно в том, что у меня получилось перегрузить оператор * для вывода значения итератора cout << *iterator, но не получается сделать *iterator = 5, то есть изменить значение элемента структуры с помощью итератора.
// List.h
template <class T>
class List {
public:
List();
List(const List& list);
~List();
class Node {
friend class List;
private:
T data;
public:
Node* next;
Node* prev;
Node() {
next = nullptr;
prev = nullptr;
}
~Node() {}
};
private:
int size;
Node* head;
Node* tail;
public:
class Iterator;
Iterator begin();
Iterator end();
};
template <typename T>
class List<T>::Iterator {
public:
Iterator();
Iterator(Node* ptr);
Iterator& operator++();
Iterator& operator--();
bool operator==(const Iterator& iter);
bool operator!=(const Iterator& iter);
T operator*();
private:
Node* current;
};
template <typename T>
List<T>::Iterator::Iterator() {
current = nullptr;
}
template <typename T>
List<T>::Iterator::Iterator(Node* ptr) {
current = ptr;
}
template <typename T>
T List<T>::Iterator::operator*() {
if (current != nullptr)
return current->data;
else
cerr << "The iterator isn't set.";
}
// main.cpp
List<int> list;
list.add(1);
list.add(2);
list.add(3);
List<int>::Iterator iter;
iter = list.begin();
*iter = 5;
Ошибка:
error C2106: =: левый операнд должен быть левосторонним значением
Ответы (1 шт):
Вы должны возвращать ссылку на элемент. При этом учитывая, что в пустом конструкторе вы инициализируете указатель как nullptr, вы должны так же бросить исключение, если указатель nullptr.
T& operator* () {
if (current) return current->data;
throw std::exception("node pointer is unitializated");
}