C++ 在这段代码中,我有一个警告:控件到达非void函数的末尾[-Wreturn type]。我怎样才能解决这个问题?

C++ 在这段代码中,我有一个警告:控件到达非void函数的末尾[-Wreturn type]。我怎样才能解决这个问题?,c++,pointers,linked-list,C++,Pointers,Linked List,代码基于一组指向字符的链接列表,而另一个类将数据存储在此类中为什么在for循环中返回0 编译器完全正确。如果for循环开始时current==NULL,则将跳过整个循环,并且不会执行任何返回,从而导致未定义的行为 无论如何,如果这可以编译的话,你会有严重和困难的bug。把他们神圣化-墙-维斯特拉和-沃罗 您可能希望在for循环之后返回0。我不知道循环到底在做什么,但您必须知道,在循环中使用“return”语句不是一个好主意。最好是打破循环,在循环之外执行“返回”行,如下所示: int Linke

代码基于一组指向字符的链接列表,而另一个类将数据存储在此类中

为什么在for循环中返回0

编译器完全正确。如果for循环开始时current==NULL,则将跳过整个循环,并且不会执行任何返回,从而导致未定义的行为

无论如何,如果这可以编译的话,你会有严重和困难的bug。把他们神圣化-墙-维斯特拉和-沃罗


您可能希望在for循环之后返回0。

我不知道循环到底在做什么,但您必须知道,在循环中使用“return”语句不是一个好主意。最好是打破循环,在循环之外执行“返回”行,如下所示:

int Linkedlist::count_value_type(Node* head_ptr, const Node::value_type& target)
{
    Node* current;
    int total = 0;

    for(current = head_ptr; current !=NULL; current = current->getLink())
    {
        if(target == current->getData())
        {
            ++total;
        }

    return 0;
    }
}

这将修复您的警告以及其他问题。还要注意,我反转了if条件以触发“break”位。

错误消息非常清楚。问题是,如果head_ptr为null,则会跳过for循环,并且不会有return语句。因此,将返回值设为0;一行低:每个函数的一个返回语句是C++中的反模式。也许它在其他没有堆栈展开的语言中很好,但是C++中只会导致更多的bug。如果你已经准备好退出函数,在循环中返回是可以的。不过我不记得每个函数都主张一次返回,我自己做多次早期返回。然而,在我看来,循环内的返回是当你确切地知道你在做什么时应该做的事情之一,就像你指出的准备退出一样。
for(...) {
    if(target != current->getData())
        break;

    total++;
}

return total;