我的代码有问题。我已经尝试了我所知道的一切,我无法摆脱警告级别1.我有这样的事情:
template <class T>
T& aghSlist<T>::at(int n) const
{
if ( (n < 0) || (n > size()))
throw aException(0, "Index out of range", __FILE__, __LINE__);
node * temp = head;
int counter = 0;
while (temp)
{
if (counter == n)
return temp->data; //here probably is the reason of warning
temp = temp->next;
counter ++;
}
}
所以
参数 - 列表中的位置;
size() - 返回列表大小,
反对 - param有助于到达n位置
temp - 指向列表中向前移动的指针
head - 列表的开头
我确定所有路径都返回一个值,但我收到此警告。在c ++中是否有可能返回对NULL的引用或以其他方式解决此问题?
答案 0 :(得分:1)
人类阅读你可以得出结论,如果你的函数没有错误,该函数将永远不会超过while
语句。因此,可以在return
语句之后省略while
语句。您的编译器无法推断出这一点。因此,它需要return
循环后的while
语句。
您可以使用以下内容来安抚编译器:
while (temp)
{
if (counter == n)
return temp->data;
temp = temp->next;
counter ++;
}
// Code should never reach here.
// These lines are here solely to pacify the compiler
static T dummy{};
return dummy;
顺便说一下,if
语句中条件的逻辑是不正确的。而不是
if ( (n < 0) || (n > size()))
应该是
if ( (n < 0) || (n >= size()))
要使n
成为有效的基于0的索引,它必须小于列表的大小。
答案 1 :(得分:1)
while(temp)
的 if (counter == n)
是多余的。只需while(n--) { temp = temp->next; } return temp->data
(您在函数开头测试范围)
答案 2 :(得分:1)
Dieter提出了一种更好的方法来构建你的功能,完全避免了这个问题。
如果算法无法实现,我会在函数的底部放置throw std::runtime_error("Unexpected code path!")
。这样,如果您遗漏了某些内容,则会将警告和静音,并将正确报告。