【问题标题】:what is the appropriate return value of a function with an if condition具有 if 条件的函数的适当返回值是什么
【发布时间】:2022-11-21 18:00:48
【问题描述】:

在这种情况下,find() 函数应该返回什么

class Student{
private: 
    string name; 
    int age; 

public: 
    string get_name(){
        return name; 
    }
    int get_age(){
        return age;
    }
}

class list_of_student{
private:
    vector <Student> list;
public: 
    vector<Student> get_list(){
        return list; 
    }
    Student find_by_name(string name){
        for(int i = 0; i < list.size(); i++){
            if(list.at(i).get_name == (name)){
                return Student.at(i); 
            }
        }
        return ???

如果没有那个名字的学生,函数应该返回什么

【问题讨论】:

  • 你可以使用std::optional&lt;Student&gt;
  • 给定签名,唯一要做的就是抛出异常。或者你可以使用std::optional。 IE。 std::optional&lt;Student&gt; find_by_name(string name){ ... }
  • 您应该返回具有该名称的所有学生的列表,如果没有找到则该列表为空。
  • {"", 0} 呢? (除非您允许还没有名字的新生儿。)
  • @brah79 就是return {};。你需要#include &lt;optional&gt;,见here

标签: c++ return-type


【解决方案1】:

好吧,它不应该返回任何 Student 类型的值,当然,这意味着如果你决定返回一些东西,返回类型函数的名称不应该是Student

如果没有找到匹配的学生,你可以让程序因断言失败而崩溃;只有在预期以不可能实现的方式使用该功能的情况下,这才是合适的。经典的 C++ 答案是“抛出异常”,但 C++ 的异常处理非常糟糕,以至于很少有人真正采用这种方法。使用这两种方法中的任何一种,您都不会返回任何事物如果搜索失败,返回类型仍然是Student

您可以让它返回一个指向学生的指针,如果没有找到学生,则返回 nullptr。这是正常的 C 方法,在 C++ 中并不少见,但它使调用代码很容易“忘记”处理潜在的故障,从而导致崩溃。它还会强制您返回对已存在对象的引用,并引发生命周期问题。

最后,您可以返回一个 std::optional&lt;Student&gt;,这类似于返回一个指针,但会使错误检查/处理更加明确,并且还允许返回一个临时的。

【讨论】:

  • 我写的正是这个答案,但你打字比我快:)
  • 您还可以返回 std::unique_ptr &lt;Student&gt;,如果调用者忘记删除返回的对象,这将避免潜在的内存泄漏。
  • 我想我必须了解更多关于 std::optional 谢谢大家
猜你喜欢
  • 2014-09-06
  • 2022-12-11
  • 2014-03-14
  • 1970-01-01
  • 2021-04-20
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多