У меня есть класс, похожий на следующий:
class MyClass {
public:
bool IsValid() const;
void MakeValid();
private:
bool CheckValidity(bool fix);
};
bool MyClass::IsValid() const {
// Check validity, but don't fix any problems found. Doesn't work.
return CheckValidity(false);
}
void MyClass::MakeValid() {
// Check validity and fix problems found.
CheckValidity(true);
}
IsValid должен быть const, потому что он не вносит изменений. MakeValid должен быть неконстантным, потому что он вносит изменения. Они имеют одну и ту же реализацию CheckValidity, но поскольку CheckValidity может или не может вносить изменения, ее нельзя пометить const.
Какой лучший способ справиться с этим? Самый простой подход - просто использовать const_cast, но отбрасывание const чувствует себя немного грязным:
bool MyClass::IsValid() const {
// Check validity, but don't fix any problems found.
return const_cast<MyClass*>(this)->CheckValidity(false);
}
Является ли это законным использованием const_cast? Есть ли лучший подход?