0

プロジェクトで STL リストを使用しようとしていますが、次の問題があります。

リストに構造体を格納したい。たとえば、これ

struct mystruct
{
    int x;
    int y;
};

次に、イテレータを使用して、このようにリスト内のすべての構造体にアクセスしています。

list<mystruct> L;
list<mystruct>::iterator lit;
for(lit=L.begin();lit!=L.end();lit++) 
    {
        if(lit->x==1) cout << "<NUM," << lit->x << "> ";
        if(lit->y==2) cout << "<ID," << lit->y << "> ";
    }

これは機能しますが、一度に 1 つの構造体を取得したいので、この func を作成しました

mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

しかし、実行後にエラーが発生し、なぜこれが起こるのか理解できません。

何がうまくいかないのですか?

4

3 に答える 3

2
mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

すでに最後にいない限りインクリメントしますが、最後にいるかどうかに関係なく、逆参照は毎回発生します。この問題を回避するには、ポインターを返すことを検討0し、最後にいる場合はポインターを返すことを検討してください。

mystruct* Myclass::next(void)
{
    if(lit!=L.end() && ++lit != L.end()) 
    {
        // dereference to get the struct, and then return the address of the struct
        return &*lit;
    }
    return 0;
    // or nullptr in C++0x
}

そして、使用するコードでもう一度0(または)確認してください。nullptrMyclass::next

于 2011-04-09T15:26:07.427 に答える
1

next() (ポインタではなく)オブジェクトを返す関数を記述している場合は、を呼び出す前に、リストに項目があるかどうかを調べるために呼び出す必要のある関数も記述する必要があると思いhas_next()ますnext()。このようなもの:

bool has_next()
{
   list<mystruct>::iterator temp = lit;
   return ++temp != L.end();
}

mystruct Myclass::next(void)
{
    if( !has_next()) 
    {
         throw "end of the list is reached";
    }
    ++lit;
    return *lit;
}

//usage
while(myClassInstance.has_next())
{
      mystruct s = myClassInstance.next();
      //work with s
}

mystructまたは、からへのポインタを返すことにした場合next()has_next()、それほど必要ありません。あなたはこれを書くことができます:

mystruct *  Myclass::next(void)
{
    ++lit;
    if( lit == L.end() ) 
         return NULL;
    return &(*lit);
}
于 2011-04-09T15:33:08.583 に答える
0

問題はここにあります:

mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

まず、点灯はどのように定義されますか?
次に、lit が L.end() と等しい場合は、デフォルト値を返す必要があります。逆参照すると、未定義の動作が発生するためです。運が良ければ、プログラムはクラッシュします。

于 2011-04-09T15:28:34.697 に答える