2016-06-07 96 views
1

列表的字符串成員,我有一個這樣的結構:C++如何訪問結構

struct student { 
    string name; 
    int practical_grade; 
    int exam_grade; 
    int number_of_absences; 
}; 

我創造了這個結構的列表。我可以訪問所有int成員,但是當我嘗試訪問name字段時,我的程序停止。任何想法爲什麼?

int main() { 
    string studentName; 
    int practicalGrade; 
    int examGrade; 
    int numberOfAbsences; 

    list <student> lista; 
    list <student>::iterator it = lista.begin(); 

    cout<<"\tName: "; cin>>studentName; 
    cout<<"\tpractical grade: "; cin>>practicalGrade; 
    cout<<"\texam grade: "; cin>>examGrade; 
    cout<<"\tnumber of absences: "; cin>>numberOfAbsences; 

    lista.push_front({studentName,practicalGrade,examGrade,numberOfAbsences}); 

    cout<< "elem: " << (*it).name; 
    cout<< "practical grade: " << (*it).practical_grade; 
    cout<< "\nexam: " << (*it).exam_grade <<' ' << (*it).number_of_absences <<"\n"; 
} 
+6

'push_front()'iinvalidates'it'用'begin()'獲得。 –

+1

由於列表爲空,因此begin()會返回結束迭代器值,該值仍然有效。但是,取消引用結束迭代器值是未定義的行爲。 –

+1

@πάνταῥεῖno。 ['push_front'](http://en.cppreference.com/w/cpp/container/list/push_front)不會使任何迭代器失效。 – user2079303

回答

0

該評論已經回答了它。在代碼中:

lista.push_front({studentName,practicalGrade,examGrade,numberOfAbsences}); 

it = lista.begin(); // Update it 

cout<< "elem: " << (*it).name; 
cout<< "practical grade: " << (*it).practical_grade; 
cout<< "\nexam: " << (*it).exam_grade <<' ' << (*it).number_of_absences <<"\n"; 
2

開始時,列表爲空。當您在空列表上調用lista.begin()時,它將迭代器返回到列表的末尾。然後,當您取消引用迭代器:(*it)時,您正在引用不指向任何元素的結束迭代器。這有未定義的行爲。

解決方案:當列表實際包含元素時,聲明並初始化it。或者簡單地說:

cout<< "elem: " << lista.front().name; 
// ...