Проблема
std::find
будет сравнивать Employee *
s в emps
с std::string
, который возвращается GetName
.Для Employee *
не определен оператор сравнения, который это делает.Мы можем сделать это, но поскольку поведение GetName
заключается в том, чтобы получить и присвоить имя пользователю, а не просто вернуть имя Employee
, это быстро превратится в беспорядок.
Решение
Первая остановка сохранения указателей на Employee
с в vector
с.Это простое изменение устранит большую часть вашей прошлой, настоящей и будущей боли.В общем, используйте new
как можно меньше ( Почему программисты на C ++ должны минимизировать использование 'new'? ), а когда вам действительно нужно new
, предпочитаете умный указатель .
vector<Employee*> emps;
становится
vector<Employee> emps;
, который имеет волновой эффект через ваш код, не в последнюю очередь
void Staff::Add()
{
Employee* emp = new Employee;
emp->GetName();
emp->GetStatus();
emp->GetSalary();
emp->GetAge();
emp->GetYearHired();
emps.push_back(emp);
}
должен стать
void Staff::Add()
{
Employee emp;
emp.GetName();
emp.GetStatus();
emp.GetSalary();
emp.GetAge();
emp.GetYearHired();
emps.push_back(emp);
}
Но также посмотрите на emplace_back
и настоятельно рекомендуем получить пользовательский ввод и затем построить emp
вокруг него.
bool operator==(const Employee & rhs) const
{
return m_Name == rhs.m_Name;
}
или friend
функцию
bool operator==(const Employee & lhs,
const Employee & rhs)
{
return lhs.m_Name == rhs.m_Name;
}
и затем измените вызов на find
для сравнения Employee
с
iter = find(emps.begin(), emps.end(), emp); // Trying to find the employee in the datbase.
Это может привести к дополнительным проблемам, поскольку iter
является const_iterator
и переменной-членом (Rubber Ducky хочет поговорить с вами об этом ).Также полностью игнорируется тот факт, что в коде есть еще несколько десятков логических ошибок.