Const правильность — C API-слой подкладки

Каковы соответствующие методы для обеспечения правильности const при написании классов, которые служат оболочками для других библиотечных API (стиль C).
Я был в процессе написания класса (Renderer), который переводит специфичные для приложения вызовы рендеринга в соответствующие вызовы OpenGL (и, возможно, DirectX позже). Этот класс на самом деле не имеет своего собственного состояния, которое модифицируется вызовами, скажем, Renderer :: applyTransform (const Matrix&), но вызывает внутренние API-интерфейсы, которые изменяют состояние OpenGL. В этом случае помечает ли такие API как правильные действия, или же «изменяемое наблюдаемое состояние» также распространяется на состояние OpenGL, которое переносит этот класс, требуя, чтобы я сделал его бесплатным?

Это похоже на Const-правильность и аппаратная запись, но, возможно, это более конкретный вариант использования.

5

Решение

Если вы вызываете функции C, которые принимают переменные-члены по неконстантному указателю, эти функции-обертки, вероятно, не должны быть константными. Если они только наблюдают за состоянием и не изменяют его, вы можете сделать ваши методы константными — даже если C API не является константно-корректным, вы можете использовать const_cast<> или же mutable на ваши переменные-члены по мере необходимости.

Думайте об этом с точки зрения семантики — если метод не изменяет состояние мира, сделайте его постоянным. Если оно действительно изменяет состояние мира, оно, вероятно, не должно быть постоянным, если измененное состояние не является чем-то вроде кеша, где это только оптимизация, которая приводит к изменению, а не что-то существенное.

3

Другие решения

Вы обязаны сделать их неconst? Нет.

Было бы неплохо, если бы семантика эффективный состояние будет изменено? Наверное, да, но это зависит от вашего общего дизайна.

2

Метод — это просто функция, и this это просто еще один параметр функции. Любой параметр может быть указателем на const, это влияет только на соответствующий аргумент и не имеет ничего общего с функцией, модифицирующей любой другой аргумент или глобальное состояние.

Так что да, const Метод может изменить глобальное состояние, в этом нет ничего плохого.

0