2013-03-20 2 views
5

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

Это похоже на Const-correctness and hardware writes, но, возможно, это более конкретный прецедент.

ответ

3

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

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

+0

Спасибо. Это немного помогло. Вокруг этого нет строгого руководства, и именно это привело к моему вопросу. Думаю, я буду придерживаться того, что говорит Бен, - это зависит от общего дизайна. Отмечая это как ответ, поскольку вы были довольно тщательно. – user2184879

0

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

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

2

Вам необходимо сделать их не const? №

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

+0

Спасибо! Это хороший отход от всего этого мышления. – user2184879

Смежные вопросы