Я пытаюсь переключить регистр и наследование на 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 и Траву, Вода и улицу в Свойствах.
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;
}
}
Помимо отсутствующего значения по умолчанию: вам не нужно повторять одинаковый код в каждом случае, вы можете просто сделать: case X: caseY: commonXYCode(); break;
Предупреждение заключается в том, что ваш switch
не охватывает все значения в вашем enum
. Предупреждение предлагает добавить случай default
, чтобы было ясно, что все другие случаи, не упомянутые явно, обрабатываются.
И если у вас по логике не будет кейса default
, потому что вызывающий уже должен был это организовать, то throw std::invalid_argument
имеет смысл для случая по умолчанию.
Для такого простого решения я бы не стал использовать оператор switch
. return type == HOME || type == TOWNHALL;
.
Вам нужно добавить 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;
}
}
Или просто добавьте возврат за пределы области действия переключателя:
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;
Вам нужно обработать все случаев. Что делать, если тип не любой из перечисленных в
switch
? Что ты тогда вернешь? Добавьте футлярdefault
.