bool Order::add(std::istream& is){
int copies;
bool keepgoing = true;
while (keepgoing){
std::cout << "Quantity (0 to quit) : ";
is >> copies;
if (copies==0){
keepgoing = false;
return false;
}else if (copies<0){
std::cout << "Enter a positive number. Try again."<<std::endl;
}else{
no_copies+=copies;
return true;
}
}
}
显示控件可能达到非void函数结束的警告。 我没有得到它。
答案 0 :(得分:3)
整个keepgoing
业务是多余的 - 您只需在退出该功能之前将其设置为false
。将其替换为“永久”循环,警告应消失:
bool Order::add(std::istream& is){
int copies;
for(;;) {
std::cout << "Quantity (0 to quit) : ";
is >> copies;
if (copies==0){
return false;
}else if (copies<0){
std::cout << "Enter a positive number. Try again."<<std::endl;
}else{
no_copies+=copies;
return true;
}
}
}
请注意,您没有检查输入是否成功,这是您应该的。
答案 1 :(得分:2)
基本上,您的代码太复杂,编译器无法提供更多有用的警告。
您添加了一个不会添加任何内容的keepgoing
变量。在您有意义地使用其值的所有情况下,其值将为true
。但是,编译器无法确定在所有相关情况下它始终为true
,并说明它可能意外地设置为false。谁知道,也许你的编译器支持你使用调试器修改变量。
如前所述,您可以轻松摆脱该变量:return
语句将导致退出while
循环,无论while
循环的条件如何
答案 2 :(得分:0)
在
之后移动return
语句
keepgoing = false;
到最后。
return false;
像:
bool Order::add(std::istream& is){
int copies;
bool keepgoing = true;
while (keepgoing){
std::cout << "Quantity (0 to quit) : ";
is >> copies;
if (copies==0){
keepgoing = false;
// No need to return from here.
// Changing keepgoing to false will break the loop.
}else if (copies<0){
std::cout << "Enter a positive number. Try again."<<std::endl;
}else{
no_copies+=copies;
return true;
}
}
return false;
}
答案 3 :(得分:0)
听起来编译器的警告并不十分清楚。警告试图说,如果你的功能到达终点,你就不会返回任何值。因为你的while循环可以想象退出 - 你正在检查一个bool变量,而不仅仅是说while (true)
- 编译器告诉你并非代码中的所有路径都返回一个值,这是一件坏事。
许多编译器会将while (true)
视为警告,因为它们很容易导致无限循环。对于无警告代码,请移动
return false
从你拥有它到功能的最后。这样,当用户输入0时,keepgoing
变量将中断while循环并落到函数末尾,返回false。