如何摆脱这些警告?

时间:2015-04-08 17:50:58

标签: c++ function

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函数结束的警告。 我没有得到它。

4 个答案:

答案 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。