2016-11-13 23 views
0

私は2つのリストを持つprogrammに取り組んでいます。リストの1つにオブジェクトが格納されます。他のリストは、オブジェクトを含むリストの項目へのポインタを格納する。新しいアイテムがオブジェクトリストに追加されると、オブジェクトへのポインタを取得したいと思います。しかし、私はいつも同じポインタを返します。 新しいアイテムが追加されたときにlist.end()が変更されないのはなぜですか?

私のプログラムは大きなことなので

は今、私はあなたの問題を表示するための新しい、より小さなものを作っ:

#include <iostream> 
#include <list> 

using namespace std; 

class C_Test 
{ 
    public: 
     int a; 
}; 

int main() 
{ 
    std::list<class C_Test> Testlist; 
    C_Test A; 
    C_Test B; 
    Testlist.push_back(A); 
    C_Test * p = &*Testlist.end(); 
    cout << p << endl; 
    Testlist.push_back(B); 
    p = &*Testlist.end(); 
    cout << p; 
} 

結果:私はプログラムの開発は別の2をプリントアウトするために期待

0x22fe20 
0x22fe20 

ポインタのリストの終わりが変更されている必要がありますか?なぜ私は同じポインタの2倍の時間を与えますか?

本当にありがとうございます。

+1

を意味すると思いますか? –

+4

'&* Testlist.end()'は未定義の動作です。 – Cornstalks

+2

'.end()'は最後の項目でも項目でもありません。最後のものの後に行く*偽のアイテムです。それは単なるマーカーなので、リスト自体には存在しません。 – HolyBlackCat

答えて

3

メンバ関数endによって返されたイテレータを参照解除するスターターでは、未定義の動作があります。

私はあなたはそれが実際に変更することが期待されるのはなぜあなたは

C_Test * p = &Testlist.back(); 
+0

私は残念ながら次のエラーを取得:initialization' –

+0

@Aに '[エラー]変換することはできません 'のstd ::リスト ::イテレータ* {別名のstd :: _ List_iterator *}' 'C_Test *' にします.Popeこれは私が示したコードとは何の共通点もありません。 –

+0

@ A.Pope再現できません。 http://ideone.com/gogWlt – HolyBlackCat

関連する問題