Список итератор не может быть увеличен? — Ошибка выполнения

Я пытался вписать создание списка в класс, но столкнулся с этой ошибкой во время выполнения, которая называется:

Ошибка отладки! Выражение: итератор списка не может быть увеличен

Я не могу понять, в чем проблема. Вот код:

// Core.cpp //

#include "Core.h"
class List {
private:
int Size;
int Values;
list<int> Data;
list<int>::iterator IT;
public:
List(int S, int V) {Size = S; Values = V;}
void MakeList();
void TargetElement(int Element);
void ChangeElement(int Value);
void DisplayList();
};

void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}

void List::TargetElement(int Element) {
advance(IT, Element);
}

void List::ChangeElement(int Value) {
list<int>::iterator INSERT = Data.begin();
Data.insert(INSERT, Value);
}

void List::DisplayList() {
list<int>::iterator OUTPUT;
for(OUTPUT = Data.begin(); OUTPUT != Data.end(); OUTPUT++) {
//cout << *OUTPUT << endl;
}
}

int main() {

List Container(10, 0);
Container.MakeList();
Container.TargetElement(3);
Container.ChangeElement(20);
Container.DisplayList();

cin.get();
return 0;
}

Любые предложения о том, как я мог бы решить эту проблему?

РЕДАКТИРОВАТЬ: я искал ответ везде, и я все еще не могу найти решение. Отладка и поиск точки останова тоже не помогли.

2

Решение

IT недействителен в течение TargetElement() так как IT это итератор, полученный из локальной переменной Data в MakeList() как Data объявлен:

void List::MakeList() {
list<int> Data(Size, Values);          // 'Data' is destructed when
list<int>::iterator IT = Data.begin(); // this method returns.
}

Я не уверен почему MakeList() даже существует, выполнить инициализацию в конструкторе:

List(int S, int V) : Size(S), Values(V), Data(S, V) {}

и удалить MakeList(), Если вы выберете этот подход, обратите внимание, что Size а также Values могут быть удалены из класса, так как они не требуются вне строительства.

1

Другие решения

Для начала, это делает местный list<int> называется Dataзатем локальный итератор называется IT присваивается своему первому элементу. Это не имеет ничего общего с вашими переменными-членами Data а также IT бы то ни было.

void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}

Скорее всего, должно быть:

void List::MakeList() {
Data.resize(Size, Values);
IT = Data.begin();
}

Беги с этим и посмотри, куда он тебя приведет.

1

Проблема здесь:

void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}

Это не инициализирует Data и IT-члены класса, а просто создает локальные переменные, называемые Data и IT, которые исчезают, когда возвращается MakeList. Чтобы инициализировать эти члены, измените конструктор на:

List(int S, int V) : Data(S, V), IT(Data.begin()), Size(S), Values(V)
{
}

Кстати, вам не нужен член Size, потому что std :: list уже хранит его размер (вы можете получить его, вызвав std :: list :: size).

1

void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}

Это создает две локальные переменные, которые скрывают переменные-члены вашего класса. Вы получаете ошибку во время выполнения, потому что IT переменная-член вашего класса никогда не устанавливается на итератор фактического объекта списка. То, что вы хотите, это слить MakeList и ваш конструктор. Для этого и нужны конструкторы.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector