предупреждение: контроль может достичь конца не пустой функции?при возвращении класса - PullRequest
1 голос
/ 08 апреля 2019

У меня есть эта функция, которая ищет идентификатор, который соответствует заимствованному идентификатору в векторе, а затем возвращает заемщика с соответствующим идентификатором.Однако я продолжаю получать это предупреждение?

Borrower getborrowerbyID(string ID)  
{
    for(int i =0; i<Borrowlist.size();i++)
    {
        if(Borrowlist[i].getID()==ID)
        {
            return Borrowlist[i];

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Вы действительно не вернетесь, если идентификатор поиска не найден. Вы можете изменить что-то вроде:

Borrower& getBorrowerByID(const std::string& ID)  
{
    auto it = std::find_if(Borrowlist.begin(), Borrowlist.end(),
                           [&](const Borrower& borrower){ return borrower.getID() == ID; });

    if (it == Borrowlist.end()) {
        throw std::runtime_error("Not found");
    }
    return *it;
}

Или указатель возврата:

Borrower* getBorrowerByID(const std::string& ID)  
{
    auto it = std::find_if(Borrowlist.begin(), Borrowlist.end(),
                           [&](const Borrower& borrower){ return borrower.getID() == ID; });

    if (it == Borrowlist.end()) {
        return nullptr; // Not found
    }
    return std::addressof(*it); // or &*it assuming no evil overload of unary operator& 
}
0 голосов
/ 08 апреля 2019

Я бы вместо этого возвратил статус успеха и передал бы соответствие через аргумент функции, например:

bool getborrowerbyID(string ID, Borrower& refBorrower)  
{
    for(int i =0; i<Borrowlist.size();i++)
    {
        if(Borrowlist[i].getID()==ID)
        {
            refBorrower = Borrowlist[i];
            return true; // signall sucess match found
        }
    }
    return false; // signal falure, ie. no match
}

Теперь вы можете проверить, было ли совпадение одновременно:

if(getborrowerbyID(ID, refBorrower))
{
      // ok
}
else
{
      // handle error
}
...