Я пытался вписать создание списка в класс, но столкнулся с этой ошибкой во время выполнения, которая называется:
Ошибка отладки! Выражение: итератор списка не может быть увеличен
Я не могу понять, в чем проблема. Вот код:
// 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;
}
Любые предложения о том, как я мог бы решить эту проблему?
РЕДАКТИРОВАТЬ: я искал ответ везде, и я все еще не могу найти решение. Отладка и поиск точки останова тоже не помогли.
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
могут быть удалены из класса, так как они не требуются вне строительства.
Для начала, это делает местный 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();
}
Беги с этим и посмотри, куда он тебя приведет.
Проблема здесь:
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).
void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}
Это создает две локальные переменные, которые скрывают переменные-члены вашего класса. Вы получаете ошибку во время выполнения, потому что IT
переменная-член вашего класса никогда не устанавливается на итератор фактического объекта списка. То, что вы хотите, это слить MakeList
и ваш конструктор. Для этого и нужны конструкторы.