Я работаю над графическим кодом для игровой библиотеки на Java. Я сделал пакет под названием com.engine.graphics
, В этом пакете у меня есть класс более низкого уровня, называемый VertexArrayObject
, Этот класс используется классами уровня клиента, которые будут использовать клиенты; однако я не хочу предоставлять клиентам доступ к VertexArrayObject
, поскольку это только усложнит их понимание моей библиотеки. Таким образом, я дал VertexArrayObject
спецификатор доступа по умолчанию; таким образом, только классы в com.engine.graphics
иметь доступ к нему, а также говорит клиентам, что им не нужно знать, что это такое.
Так же, как существует это стандартное соглашение для Java, я полагал, что для C ++ должно быть какое-то стандартное соглашение для решения этой проблемы; однако мои поиски в интернете не дали результатов.
Итак, мой вопрос, что такое конвенция? И если его нет, какой подход лучше?
В C ++ нет понятия «пакет», поэтому технически невозможно «защитить пакет». (Есть предложение для модулей, но оно не будет включено даже в грядущий стандарт C ++ 17).
Есть много способов скрыть класс от внешнего мира или ограничить доступ к нему, на уровне синтаксиса вы можете прибегнуть к:
Наличие большого количества классов и функций друзей — беспорядок, но есть причина требовать явного перечисления их: они нарушают принцип инкапсуляции.
Наконец, вы можете использовать идиому «частной реализации» (иначе pimpl, иначе непрозрачный указатель), который состоит в определении видимого класса, содержащего указатель на класс реализации, и переадресации всех вызовов, пока класс реализации определен в отдельном файле cpp или дизайн фасада.
Выберите то, что кажется подходящим для данного отношения класса. Стандартная библиотека предпочитает вложенные классы, в то время как Qt, популярная графическая библиотека, использует pimpl.
Других решений пока нет …