我试图在列中创建列表,但遇到了这个名为:
的运行时错误调试断言失败!表达式:列表迭代器不可递增
我无法弄清问题是什么。这是代码:
// 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;
}
有关如何解决此问题的任何建议?
编辑:我到处寻找答案,我似乎仍无法找到解决方案。调试和找到断点也没有帮助。答案 0 :(得分:1)
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 :(得分: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();
}
使用它运行并查看它的使用位置。
答案 2 :(得分:1)
问题在于:
void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}
这不会初始化类的数据和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来获取它。)
答案 3 :(得分:0)
void List::MakeList() {
list<int> Data(Size, Values);
list<int>::iterator IT = Data.begin();
}
这是创建两个局部变量,它们隐藏了类的成员变量。您将收到运行时错误,因为类的IT
成员变量永远不会设置为实际列表对象的迭代器。你想要的是合并MakeList
和你的构造函数。这就是构造函数的用途。