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