У меня есть класс с методом (геттером), который выполняет относительно затратную операцию, поэтому я хочу кэшировать ее результат. Вызов метода не меняет поведение объекта, но он должен сохранить результат в this
, поэтому он не может быть константой.
Проблема в том, что теперь у меня есть другой метод, который является const, и мне нужно вызвать мой геттер. Есть ли какое-то общепринятое решение этой проблемы? Должен ли я обойти проверку константности в геттере, чтобы сделать его константным (разве это не вызовет проблем с оптимизирующим компилятором?), или я должен распространить непостоянство на все методы, которые используют этот геттер?
Пример:
class MyClass
{
public:
Foo &expensiveGetter() /*const?*/
{
if (cachedValue == nullptr) {
cachedValue = computeTheValue();
}
return *cachedValue;
}
void myMethod() /* How to make this const? */
{
auto &foo = expensiveGetter();
// etc.
}
private:
Foo *cachedValue = nullptr;
}
Не могли бы вы сделать ответ из этого?
один из моих любимых вопросов по С++, который я задаю кандидату на собеседовании, который назвал себя «экспертом уровня С++», был = «что означает изменчивость?» , никогда не было правильного ответа
Это одна из ситуаций, когда mutable
спецификатор подходит особенно хорошо. Когда членом класса является mutable
, этот член можно изменить, даже если окружающий класс — const
.
Итак, если MyClass::cachedValue
является mutable Foo*
вместо Foo*
, у вас могут быть const
функции-члены в MyClass
, которые вносят изменения в cachedValue
, и тогда весь вызывающий код может просто воздействовать на const MyClass
как обычно.
cachedValue
mutable
членомMyClass