【发布时间】: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