查找功能应该在失败结果中返回什么?

时间:2018-12-31 17:02:41

标签: c++ function return

自从我第一次实现List类以来,这个问题一直困扰着我,在那里我需要一种方法来查找数据等于输入值的节点。如果==,那么显然可以立即返回。然而在其他方面?那应该怎么办?

我考虑过引发异常,但是当程序从函数调用中识别出故障时会如何表现?

line = 'Here is my code and output below, i would like to have it so that instead of saying how many occurrences, it would output the number of times the letter appears in asterisk form.'

h = Hash.new(0)
line.downcase.each_char{ |ch| h[ch] += 1 if ('a'..'z').include? ch }
h.to_a.sort_by(&:last).reverse.each { |ch, count| puts "#{ch}: " + "*" * count}

好吧,我有点期望如果搜索成功,它会返回一个指向节点的指针,因此如果需要,我可以在函数调用中访问它的值。

2 个答案:

答案 0 :(得分:1)

nullptr是搜索失败时的正确返回值。这是使用指针而不是引用的优势,因为如果您知道自己将始终拥有一个值,则可以返回引用。

当从函数调用中收到指针时,调用代码应始终检查nullptr,并处理搜索失败的事实。

F.60中的C++ Core Guidelines状态:

  

当“无参数”是有效选项时,将T *优先于T&

     

指针(T *)可以是nullptr,而引用(T&)不能,没有有效的“空引用”。有时使用nullptr代替指示的“无对象”很有用,但是如果没有用,则引用在符号上会更简单,并且可能会产生更好的代码。

答案 1 :(得分:0)

有许多处理这种情况的常用方法。正确的选择很大程度上取决于您要返回的是什么类型的东西。

  1. 如果您要返回迭代器,通常需要返回调用者传递的“末尾一个”迭代器,以定义要搜索的范围。
  2. 通常使用指针返回一个空指针(这是问题中的代码实际执行的操作,尽管您可能没有意识到,或者已经忘记了)。
  3. 如果要返回参考,则有两种选择。使用它可以将返回类型从foo &更改为optional<foo &>。另一个方法是定义一个“空”对象,并在失败时返回对该对象的引用。