2016-06-07 98 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; 
// ...