У меня есть класс, похожий на следующий:
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
? Есть ли лучший подход?