【问题标题】:return bool in switch case在开关盒中返回布尔值
【发布时间】:2018-05-02 11:24:56
【问题描述】:

我正在尝试在 C++ 中切换大小写和继承,但发现了一些问题/警告。

比如我有一个抽象的基础类Field:

Field.h

class Field{
  private:
  FieldType type_;

  public:
  enum FieldType
  {
    GRASS,WATER,STREET,HOME,TOWNHALL
  };
virtual bool checkIsBuildable(Fieldtype type);

现在我在子类 Buildings.cpp 和 Properties.cpp 中收到警告:

  warning enumeration value GRASS,WATER,STREET bit handled in switch

因为它是一个布尔值,我只能在默认情况下返回 false 或 true,并且该方法无法正常工作,或者? 我只想检查 Buildings.cpp 中的 Home 和 Townhall 以及 Properties 中的 Grass、Water 和 street。

Buildings.cpp

bool Buildings::isBuildable(Field::FieldType type)
{    
   switch(type)
  {
    case Field::HOME:
      return true;
    case Field::TOWNHALL:
      return false;
  }
}

Properties.cpp

 bool Properties::isBuildable(Field::FieldType type)
{    
   switch(type)
  {
    case Field::GRASS:
      return true;
    case Field::WATER:
      return false;
    case Field::STREET:
      return false;
  }
}

【问题讨论】:

  • 您需要处理所有个案例。如果类型不是您在switch 中列出的类型怎么办?那你还什么?添加default 案例。
  • 除了缺少的默认值:您不需要在每种情况下都重复相同的代码,您可以这样做:case X: caseY: commonXYCode(); break;
  • 警告是您的switch 并未涵盖enum 中的所有值。警告建议添加 default 案例,因此很明显所有其他未明确提及的案例都已处理。
  • 如果您在逻辑上不会有 default 案例,因为调用者应该已经安排好了,那么 throw std::invalid_argument 对于默认案例是有意义的。
  • 对于这么简单的决定,我不会使用switch 声明。 return type == HOME || type == TOWNHALL;.

标签: c++ enums switch-statement


【解决方案1】:

需要加default:return true;或return false;在这种情况下;

bool Properties::isBuildable(Field::FieldType type)
{    
   switch(type)
  {
    case Field::GRASS:
      return true;
    case Field::WATER:
      return false;
    case Field::STREET:
      return false;
    default:
      return false;

  }
}

或者只是在 switch 范围之外添加 return:

bool Properties::isBuildable(Field::FieldType type)
{    
   switch(type)
  {
    case Field::GRASS:
      return true;
    case Field::WATER:
      return false;
    case Field::STREET:
      return false;
  }

  return false;
}

因为如果您的类型不等于 case 中的值之一,那么函数将不会返回任何值,您需要借助上面显示的方法来修复它。

【讨论】:

  • 啊,真的,因为虚拟方法只会在正确的类中调用自己。非常感谢!
  • 你可以删除一组行,这样你就有case Field::Grass: case Field::Concrete: return true; default: return false;
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 2016-11-22
  • 2023-03-04
  • 2021-04-04
  • 2012-06-21
  • 2015-02-14
  • 2013-08-18
  • 1970-01-01
相关资源
最近更新 更多