2011-12-07 25 views
5

这里是我的代码:“控制到达非void函数结束”在Eclipse C警告++,但没有编译期或运行时错误

Composer& Database::GetComposer (string in_last_name) 
{ 
    for (int i = 0; i < next_slot_; i++) 
    { 
     if (composers_[i].last_name() == in_last_name) 
      return composers_[i]; 
    } 
} 

的想法是遍历作曲对象和返回数组对last_name字段与“in_last_name”匹配的对象的引用。我了解警告告诉我什么,即该函数可能不会返回任何内容(例如,如果用户提供了无效的姓氏)。我的问题是,我怎样才能避免这种情况?我尝试在for循环后面添加“return 0”和“return NULL”,它不会编译。如果此方法发现任何内容,应该抛出异常吗?

+1

你应该抛出异常。 –

+1

警告是您的代码中真正的逻辑错误。修正所有警告(并且将警告级别调高至(合理的)可能) –

+0

即使try/catch块抛出标准异常,我仍然会收到同样的警告。 – wbr

回答

6

您的函数声明返回Composer&,即对Composer的引用。如果你的函数没有返回一个合适的引用,并且调用者试图使用某个返回值,那么会导致未定义的行为。

如果你的函数可以合法地无法找到它的寻找,可能要返回类型更改为指针而不是参考。这将使你返回NULL的选项:

Composer* Database::GetComposer (string in_last_name) 
{ 
    for (int i = 0; i < next_slot_; i++) 
    { 
     if (composers_[i].last_name() == in_last_name) 
      return &composers_[i]; 
    } 
    return NULL; 
} 

或者,你可以当你的函数未能找到目标抛出异常。

+0

当我这样做时,我收到以下错误消息:“类型'Composer&'的非const引用从'int'类型的右值初始化无效” – wbr

+0

您在哪个源代码行发生错误? –

+0

与返回NULL语句在同一行。 – wbr

相关问题