C++函数返回空结构体

6

我有一个如下的结构体

struct AUTO{
   int weight;
   string name;
}

我有一个函数,通过传递“name”返回一个结构体。
AUTO autoByName(String name, AUTO a[], int ll)
{
   for(int i = 0; i < ll; i++)
   {
      if (name == a[i].name)
      {
         return a[i];
      }
   }

   // AND HERE ?????
}

但是我不知道在函数结尾应该返回什么。结构体有null值吗?


3
不行。你必须设计一些代表空值的值,例如返回某种可测试的可选对象(例如参见boost::optional)。 - juanchopanza
@juanchopanza:你应该把那个作为答案发布。 - Keith Thompson
2
有许多选项:返回指针(nullptr 是有效的返回值),抛出异常,返回布尔值并通过引用参数返回值,使用“哨兵”值表示无效的 AUTO... - crashmstr
@KeithThompson 我正在寻找好的重复问题。虽然有很多,但到目前为止我只发现了一些回答不好的问题。 - juanchopanza
结构体实例为空是没有意义的。这不是Java,大多数东西都是对象的引用。 - Ed S.
1个回答

6
你有很多选择:
  1. AUTO 添加表示“无值”的方式。例如,通过将权重设置为-1或添加一个标志。这样做相当丑陋,我不建议这样做,尽管在实践中它有些常见。
  2. 返回(智能)指针而不是值。这样,你可以在出现错误/没有值的情况下返回nullptr。这也很丑陋,因为它迫使你处理指针,但原因并不十分充分。
  3. 返回单独的值来表示成功。例如,在函数中添加一个bool &wasFound参数。
  4. 返回boost::optionalstd::pair<AUTO, bool>来完成几乎相同的事情,但所有内容都包含在返回值中。这可能是最干净的方法。例如,这就是std::map::find的工作原理。
  5. 抛出异常。如果调用者不会试图查找不存在的项目,则这可能是可接受的。换句话说,如果“未找到”只是一个返回值,那么就不要抛出异常。如果“未找到”确实是程序错误条件,则抛出异常可能是合理的。如果你不确定,请不要抛出异常。
我建议使用#4,或在更罕见的情况下使用#5。

如果需要更明确,选择选项#5,如果找不到匹配对象则为错误案例。如果通常对象可能不存在且需要查询其存在,则选择选项#4。 - NickC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接