我重载了下标操作符,给定一个名称将搜索列表,如果找到名称,它将改变该人的号码。问题是如果找不到这个人该怎么办。
我收到警告control reaches end of non-void function
,但我不知道该函数应该作为默认值返回。
string& List::operator[](string name)
{
//loop through the list and see if the name exists
for(int i = 0; i < nr_entries; i++)
{
//if it does, return the address for it
if(listEntries[i].getName() == name)
return listEntries[i].changeNr();
}
}
答案 0 :(得分:1)
我认为你应该重新思考你的设计。在我看来,索引运算符在这里确实不是正确的方法,而是您的类的用户搜索的东西,并期望结果反映用户正在查找的项目发现与否。
首先,你应该从使用索引操作符改为使用适当名称的普通成员函数,包括单词&#34; search&#34;或者&#34;找到&#34;。
您还应该多考虑一下您想要回归的内容。您调用名为changeNr
的函数来返回一个字符串。这对我来说真的没有意义,改变&#34;改变&#34;意味着你想改变一些东西,并且&#34; nr&#34;暗示一个数字。因此,只要看到名称changeNr
,我希望函数更改一个数字,而不是返回一个字符串。也许它获得更改号码?那么为什么不将它重命名为getChangeNr
?但那么&#34;数字&#34; bit仍然挥之不去,也许它应该真的返回一个数字,在这种情况下你的搜索功能还应该返回一个数字?在这种情况下,如果找不到元素,您只需返回一个永远不存在的数字(-1
,INT_MAX
等)。
如果函数真的应该返回一个字符串,那么不再使用索引操作符,为什么不简单地返回一个简单的std::string
对象而不是引用?如果用户应该能够修改字符串,您可以考虑将函数返回到完整结构的指针(或引用)。
如果你真的想要返回对字符串的引用,那么如果找不到该元素,则返回一个静态成员变量,并通过文档指示用户必须检查返回的引用与此静态成员变量相同,以查看它是否相同。
如果找不到该元素,你当然可以抛出异常,但这应该是特殊情况下保留的。如果找不到该元素是常见的,那么这并非例外,您应该尽量避免例外。
最后,无论你决定做什么,你需要考虑的重要事情是文档!无论你走哪条路,如果功能没有详细记录,用户就不会知道它做了什么,以及期待什么。那个&#34;用户&#34;将你包括一年或两年。记录函数所采用的参数,以及它可能返回的值,然后记录为什么它返回它所做的事情,因为它比它如何更重要(&#34;如何&# 34;可以通过代码看到。)
答案 1 :(得分:0)
可能性是无穷无尽的,但我首先想到的是返回对零长度字符串或字符串(如“”)的引用。调用者应根据这些可能性检查返回值。请注意,无论选择哪个默认字符串,都可能应该声明static
,以便在函数返回并弹出堆栈时它不会超出范围。
答案 2 :(得分:0)
您可以抛出异常,可以将返回类型更改为字符串*并返回空指针,或者您可以添加条目并返回新字符串。
最后一个是std :: map的例子。
但实际上你应该考虑你想要多少重载[]运算符,因为以上都不是你想要的,你得到的聪明的[]语法真的不那么重要。< / p>