Ленивая оценка и проблемы с правильностью - PullRequest
5 голосов
/ 21 декабря 2010

Я создал класс камеры openGL, который использует ленивую оценку для предоставления окончательных проекций или матриц проекции вида модели через функции получения. Пользователь предоставляет различные параметры камеры на протяжении всего жизненного цикла экземпляра (FOV, положение и т. Д.), Но вместо того, чтобы пересчитывать матрицу проекции и / или матрицу MVP при каждом изменении параметра, устанавливается флаг «изменен» ( т.е. старая кэшированная матрица теперь недействительна). Всякий раз, когда пользователь запрашивает обновленную конечную матрицу, она пересчитывается, результат кэшируется и возвращается константная ссылка.

Все звучит нормально, пока я не позвоню своему:

const QMatrix4x4& oE_GLCamera::getModelViewProjection() const;

функция из экземпляра const oE_GLCamera ... Я использую ссылки const повсюду в своем приложении, чтобы извлекать данные камеры из окон просмотра CAD, не меняя камеру, но моя функция получения выполняет ленивый анализ переменных-членов, если они недопустимы - поэтому прерывание const -correctness.

Есть ли какая-либо языковая функция или парадигма дизайна, о которой я не знаю, чтобы помочь с этим? Или ленивая оценка в корне несовместима с константностью? Я знаю о const_cast <>, я никогда не использовал его сам, но прочитал несколько вещей об этом, которые сводятся к следующему: если вы используете его, вы уже где-то ошиблись. Или это будет мой спаситель?

Любой совет будет принят, Cam

1 Ответ

15 голосов
/ 21 декабря 2010

Есть ли какая-либо языковая функция или парадигма дизайна, о которой я не знаю, чтобы помочь с этим?

Возможно, mutable?

Член класса, помеченный как mutable, всегда не является const, даже если к нему обращаются через ссылку или указатель на класс-владелец, который является ссылкой const или указателем на const .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...