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()ため、内では無効です。ITDataMakeList()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メンバーを初期化するのではなく、MakeListが戻ると消えるDataおよびITと呼ばれるローカル変数を作成するだけです。これらのメンバーを初期化するには、コンストラクターを次のように変更します。

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

ちなみに、std :: listにはすでにサイズが保存されているため、Sizeメンバーは必要ありません(std :: list :: sizeを呼び出すことで取得できます)。

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

これは、クラスのメンバー変数をシャドウする2つのローカル変数を作成しています。ITクラスのメンバー変数が実際のリストオブジェクトのイテレータに設定されていないため、ランタイムエラーが発生します。必要なのは、MakeListとコンストラクターをマージすることです。これがコンストラクターの目的です。

于 2012-11-21T21:07:59.053 に答える