Каковы соответствующие методы для обеспечения правильности const при написании классов, которые служат оболочками для других библиотечных API (стиль C).
Я был в процессе написания класса (Renderer), который переводит специфичные для приложения вызовы рендеринга в соответствующие вызовы OpenGL (и, возможно, DirectX позже). Этот класс на самом деле не имеет своего собственного состояния, которое модифицируется вызовами, скажем, Renderer :: applyTransform (const Matrix&), но вызывает внутренние API-интерфейсы, которые изменяют состояние OpenGL. В этом случае помечает ли такие API как правильные действия, или же «изменяемое наблюдаемое состояние» также распространяется на состояние OpenGL, которое переносит этот класс, требуя, чтобы я сделал его бесплатным?
Это похоже на Const-правильность и аппаратная запись, но, возможно, это более конкретный вариант использования.
Если вы вызываете функции C, которые принимают переменные-члены по неконстантному указателю, эти функции-обертки, вероятно, не должны быть константными. Если они только наблюдают за состоянием и не изменяют его, вы можете сделать ваши методы константными — даже если C API не является константно-корректным, вы можете использовать const_cast<>
или же mutable
на ваши переменные-члены по мере необходимости.
Думайте об этом с точки зрения семантики — если метод не изменяет состояние мира, сделайте его постоянным. Если оно действительно изменяет состояние мира, оно, вероятно, не должно быть постоянным, если измененное состояние не является чем-то вроде кеша, где это только оптимизация, которая приводит к изменению, а не что-то существенное.
Вы обязаны сделать их неconst
? Нет.
Было бы неплохо, если бы семантика эффективный состояние будет изменено? Наверное, да, но это зависит от вашего общего дизайна.
Метод — это просто функция, и this
это просто еще один параметр функции. Любой параметр может быть указателем на const
, это влияет только на соответствующий аргумент и не имеет ничего общего с функцией, модифицирующей любой другой аргумент или глобальное состояние.
Так что да, const
Метод может изменить глобальное состояние, в этом нет ничего плохого.