【问题标题】:warning: control may reach end of non-void function? when returning class警告:控制可能到达非无效函数的结尾?返校时
【发布时间】:2019-08-29 07:59:08
【问题描述】:

我有这个函数,它将在向量中搜索与借用 ID 匹配的 ID,然后返回具有匹配 ID 的借用者。 但是我一直收到这个警告?

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

        }
    }
}

【问题讨论】:

  • 如果Borrowlist 中没有匹配项会怎样? return 永远不会被调用,函数将在最后退出循环。您需要找到某种方式向调用代码发出未找到匹配项的信号,并将其返回。
  • 顺便说一句,如果您只是在 vector&lt;string&gt; 中搜索匹配项,则 STL 中的一些方法可以为您执行此操作。
  • 正如史蒂夫指出的那样,如果找不到 ID 会怎样?你最终在函数的末尾没有返回语句。那么函数应该返回什么?另外,请查看In C++ check if std::vector<string> contains a certain value
  • 在最后的语句中使用一些throw

标签: c++ class return


【解决方案1】:

当没有找到搜索 ID 时,您确实不会返回。您可能会更改为:

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& 
}

【讨论】:

    【解决方案2】:

    我会改为返回成功状态并通过函数参数传递匹配,如下所示:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多