Основная проблема, я думаю, что вы возвращаете, если Select
ничего не находит? Функция должна возвращать сотрудника. У вас может быть специальный Employee
с бессмысленным empId
(например, -1
), чтобы указать это, и изменить
for (int i = 0; i < length; i++)
{
cout << Select(search, key, i).empId;
}
на
for (int i = 0; i < length; i++)
{
Employee selected = Select(search, key, i);
if (selected.empId != -1)
{
cout << Select(search, key, i).empId;
}
}
В качестве альтернативы вы можете изменить Функция Select
возвращает указатель Employee *
, а затем возвращает nullptr
, если совпадения нет. Это
Employee* Select(int s, string k, int c)
{
int result;
int i = c; // why not just use c directly? Or change the argument to int i?
switch(s)
{
case 1:
result = emp[i].empId.find(k);
if (result >= 0)
{
return &emp[i]; // note taking address, could also write emp + i
}
break; // don't need this with no further cases
}
return nullptr; // reached if no match above
}
Затем следует
for (int i = 0; i < length; i++)
{
Employee* selected = Select(search, key, i);
if (selected != nullptr)
{
cout << Select(search, key, i)->empId; // not pointer indirection
}
}
На самом деле вы, вероятно, захотите вернуть const Employee const*
, но это еще одна топи c.
Еще один вариант - Select
генерировать исключение, если оно ничего не находит, и помещать вызов на Select(search, key, i);
в блоке try .. catch
. Я обычно предпочитаю не использовать исключения для потока управления, как это, но это другой метод.