2016-11-13 34 views
0

我正在研究一個有兩個列表的程序。列表中的一個存儲對象。另一個列表存儲指向包含對象的列表項的指針。當一個新項目被添加到對象列表中時,我想獲取指向該對象的指針。但我總是得到相同的指針返回。爲什麼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; 
} 

結果:

0x22fe20 
0x22fe20 

我期望PROGRAMM打印出兩個不同的自列表結束後的指針應該改變了?爲什麼它給了我兩次相同的指針?

我真的很感謝你在這件事上的幫助。

+1

爲什麼你會希望它真正改變? –

+4

'&* Testlist.end()'是未定義的行爲。 – Cornstalks

+2

'.end()'不是最後一個項目,也不是一個項目。這是*最後一個*之後的*假*項目。因爲它只是一個標記它並不存在於列表本身中。 – HolyBlackCat

回答

3

對於取消引用成員函數end返回的迭代器的初學者有未定義的行爲。

我想你的意思

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

隨着你的代碼我不幸地得到以下錯誤: '[錯誤]不能轉換'std ::列表 :: iterator * {aka std :: _ List_iterator *}'在初始化中的'C_Test *' –

+0

@A .Pope這與我所展示的代碼沒有任何共同之處。 –

+0

@ A.Pope無法重現。 http://ideone.com/gogWlt – HolyBlackCat

相關問題