Мы работаем над настраиваемым классом List. Мы пытаемся реализовать итератор и const_iterator и его функции, но у нас есть проблема с нашими операторами ++. PostFix вообще не работает, а PreFix дает нам segfault, когда мы заходим слишком далеко (текущий код — это обходной путь, который просто возвращает последний действительный результат).
Вопрос 1: Как мы можем исправить ошибку, связанную с префиксом, без возврата последнего действительного элемента? (мы попытались вернуть nullptr).
Postfix просто не повторяется, хотя мы следовали всем инструкциям в Интернете <,<
Вопрос2: почему не работает PostFix?
Код для поста&префикс:
List_const_iterator_& operator++()
{
if(ptr->next_ != nullptr)
{
ptr = ptr->next_;
return *this;
}
else
return *this;
}
List_const_iterator_ operator++(int unused)
{
List_const_iterator_ temp(*this);
if(ptr->next_ != nullptr)
{
ptr = ptr->next_;
return temp;
}
else
return *this;
}
Тест-код (атм с постфиксом):
List<int> list1 {324, 2, 3};
List_const_iterator_<int> clst = list1.cbegin();
clst = clst++;
cout << "val: " << clst.ptr->data_ << endl;
clst = clst++;
cout << "val2: " << clst.ptr->data_ << endl;
clst = clst++;
cout << "val3: " << clst.ptr->data_ << endl;
Вывод для постфикса:
val: 324
val2: 324
val3: 324
Выход для префикса:
val: 2
val2: 3
val3: 3 <-- This is where we segfault if we don't use the controll.
Попробуйте просто:
clst++;
вместо :
clst = clst++;
Последний сбрасывает clst
к его первоначальному значению (как будто увеличение не произошло).
Других решений пока нет …