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*
?啊哈。我错过了那部分。这清除了这段代码,但现在它通过我的程序的其余部分级联。我看看能不能把它弄清楚。