2015-03-31 2 views
2

Я новичок в C++ ... Я делаю несколько классов - один для Student и один для курсов. В курсах добавлен «список», который добавляет студенческие объекты.Удалить объект из списка C++

Я могу добавить студента:

void Course::addStudent(Student student) 
{ 
    classList.push_back(student); 
} 

Но когда я иду, чтобы удалить студент, я не могу удалить его. Я получаю длинную ошибку о том, что Student не был получен и что-то о operator == (const allocator).

void Course::dropStudent(Student student) 
{ 
    classList.remove(student); 
} 

Любые предложения? Спасибо!

Я имел в виду на этот сайт для того, как добавлять/удалять элементы: http://www.cplusplus.com/reference/list/list/remove/

Student Код:

class Student { 
std::string name; 
int id; 
public: 
void setValues(std::string, int); 
std::string getName(); 
}; 

void Student::setValues(std::string n, int i) 
{ 
name = n; 
id = i; 
}; 

std::string Student::getName() 
{ 
    return name; 
} 

Полный код курса:

class Course 
{ 
std::string title; 
std::list<Student> classList; //This is a List that students can be added to. 
std::list<Student>::iterator it; 

public: 
void setValues(std::string); 
void addStudent(Student student); 
void dropStudent(Student student); 
void printRoster(); 
}; 
void Course::setValues(std::string t) 
{ 
    title = t; 
}; 

void Course::addStudent(Student student) 
{ 
    classList.push_back(student); 
} 

void Course::dropStudent(Student student) 
{ 
    classList.remove(student); 
} 

void Course::printRoster() 
{ 
    for (it=roster.begin(); it!=roster.end(); ++it) 
    { 
     std::cout << (*it).getName() << " "; 
    } 
} 
+0

Мы будем нуждаться более подробно. Мы даже не знаем, какой тип объекта classList, или как выглядит функция remove. – dwcanillas

+0

Извините за путаницу, я редактировал мой документ.Надеюсь, это более понятно. – user3281388

+2

Пожалуйста, размещайте точные сообщения об ошибках - не описывайте их. Также нам нужно посмотреть, что состоит из «Студента». Если 'classList' является' std :: list', то 'remove()' требует, чтобы 'Student' требовал оператора равенства (' operator == ') – PaulMcKenzie

ответ

3

Вопрос, как указано, что Student отсутствует operator==, который требуется std::list::remove.

#include <string> 
class Student { 
    std::string name; 
    int id; 

public: 
    bool operator == (const Student& s) const { return name == s.name && id == s.id; } 
    bool operator != (const Student& s) const { return !operator==(s); } 
    void setValues(std::string, int); 
    std::string getName(); 
    Student() : id(0) {} 
}; 

Обратите внимание, как и operator== и operator != перегружены. Ожидается, что если два объекта можно сравнить с ==, то != также должен быть доступен для использования. Проверьте, как operator!= написано в терминах operator ==.

Также обратите внимание, что параметр передается как ссылка на константу, а сами функции - const.

Живой пример: http://ideone.com/xAaMdB

+0

Большое спасибо! Это работает! Я начал работать над добавлением оператора, но потом увидел ваш комментарий. Я был близок, но не совсем. Я очень ценю вашу помощь! Спасибо! – user3281388

7

std::list::remove() удаляет все элементы список, который сравнивает одинаковый с элементом, который вы предоставляете. Вы не даете своего определения Student, но, скорее всего, у вас нет метода operator ==(), поэтому вызов remove() невозможен.

+0

Должен ли я сделать метод compare(), который будет использовать 'operator ==()', а затем вызвать этот метод в моем remove (compare())? – user3281388

+0

Вы могли бы, но вы могли бы просто определить метод в классе, чтобы сравнить два класса 'Student' -' bool Student :: operator == (Student &) 'и решить, что делает двух учеников равными на этой основе – Oldcat

+0

@ user3281388' list :: remove' будет использовать '==' для сравнения двух объектов. Он ничего не знает и ничего не сделает с вашей функцией 'compare()'. Если вы хотите написать функцию 'compare()', которая будет использоваться вами или другими функциями, то это совсем другая история. – PaulMcKenzie

2

Этот список не может удалить вашу студенческую причину, поскольку он не может знать, как сравнить учащихся в списке с тем, который был присвоен методу remove.
Примечание, что студент передается по значению и, следовательно, является другим экземпляром, чем тот, который указан в списке.

Одна вещь, которую вы можете сделать, это реализовать operator== в Student, который поможет список найти ваш студент.

Еще одна возможность (особенно актуальная, если вы не можете изменить класс Student) будет содержать список Student* (указатель ученика), а затем список сможет сравнить указатели и найти тот, который вы пытаясь удалить.

+1

-0.5 для предложения указателя –

+0

Лучше всего создать отдельный метод 'operator ==', или было бы хорошо положить его в мой метод удаления? – user3281388

+0

'operator ==' должен быть частью класса 'Student'. Обычно это выполняется вне класса. проверьте ссылку [this] (http://en.cppreference.com/w/cpp/language/operators). –

Смежные вопросы