Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;控制达到非无效函数的末尾“;EclipseC+中的警告+;但是没有编译或运行时错误_C++_Eclipse_Null_Return - Fatal编程技术网

C++ &引用;控制达到非无效函数的末尾“;EclipseC+中的警告+;但是没有编译或运行时错误

C++ &引用;控制达到非无效函数的末尾“;EclipseC+中的警告+;但是没有编译或运行时错误,c++,eclipse,null,return,C++,Eclipse,Null,Return,这是我的密码: 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]; } } Composer&Database::GetComposer

这是我的密码:

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];
    }
}
Composer&Database::GetComposer(姓氏中的字符串)
{   
对于(int i=0;i

其思想是迭代Composer对象数组并返回对last_name字段与“in_last_name”匹配的对象的引用。我理解警告告诉我的内容,即函数可能不会返回任何内容(例如,如果用户提供了无效的姓)。我的问题是,我如何避免这种情况?我尝试在for循环之后添加“return0”和“returnnull”,但它无法编译。如果此方法未找到任何内容,是否应引发异常?

您的函数被声明为返回一个
编写器&
,即对
编写器的引用。如果您的函数未能返回合适的引用,并且调用方试图使用返回值进行某些操作,则会导致未定义的行为

如果您的函数可能无法合法地找到它要查找的内容,您可能希望将返回类型更改为指针而不是引用。这样您就可以选择返回
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;
}
Composer*数据库::GetComposer(姓氏中的字符串)
{   
对于(int i=0;i

或者,当函数无法找到目标时,您可以抛出异常。

您应该抛出异常。警告实际上是代码中的逻辑错误。修复所有警告(并将警告级别提高到尽可能高(合理)的程度),即使try/catch块抛出标准异常,我仍然会收到相同的警告。我应该注意,我只在eclipse中编译时收到警告,而不是在命令行中使用g++时。@wbr:gcc默认情况下不会发出太多警告。Eclipse可能会在命令行中添加一些选项来打开最有用的警告。至于您对
throw
的评论:
try/catch
块不需要写到
throw
,而
try/catch
就是要
catch
。。。您应该阅读更多关于异常语法的内容。当我这样做时,我收到以下错误消息:“从类型为“int”的右值初始化类型为“Composer&”的非常量引用无效”,与return NULL语句位于同一行。您是否将函数的类型从
Composer&
更改为
Composer*
?啊哈。我错过了那部分。这清除了这段代码,但现在它通过我的程序的其余部分级联。我看看能不能把它弄清楚。