2

我试图在一个类中创建列表,但遇到了这个运行时错误,称为:

调试断言失败!表达式:列表迭代器不可递增

我无法弄清楚问题是什么。这是代码:

// 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;
}

关于如何解决此问题的任何建议?

编辑:我到处寻找答案,但似乎仍然找不到解决方案。调试和找到断点也无济于事。

4

4 回答 4

1

IT在内部无效,TargetElement()因为它是从as重新声明IT的局部变量获得的迭代器:DataMakeList()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可以从类中删除,因为它们在构造之外不需要。

于 2012-11-21T21:07:05.623 回答
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();
}

带着它跑,看看它会把你带到哪里。

于 2012-11-21T21:08:06.000 回答
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 来获取它)。

于 2012-11-21T21:13:15.490 回答
0
void List::MakeList() {
    list<int> Data(Size, Values);
    list<int>::iterator IT = Data.begin();
}

这是创建两个局部变量来隐藏类的成员变量。您收到运行时错误,因为IT您的类的成员变量从未设置为实际列表对象的迭代器。你想要的是合并MakeList和你的构造函数。这就是构造函数的用途。

于 2012-11-21T21:07:59.053 回答