2016-06-07 4 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; 
// ... 
Смежные вопросы