C++ версия защиты пакетов Java?

Я работаю над графическим кодом для игровой библиотеки на Java. Я сделал пакет под названием com.engine.graphics, В этом пакете у меня есть класс более низкого уровня, называемый VertexArrayObject, Этот класс используется классами уровня клиента, которые будут использовать клиенты; однако я не хочу предоставлять клиентам доступ к VertexArrayObject, поскольку это только усложнит их понимание моей библиотеки. Таким образом, я дал VertexArrayObject спецификатор доступа по умолчанию; таким образом, только классы в com.engine.graphicsиметь доступ к нему, а также говорит клиентам, что им не нужно знать, что это такое.

Так же, как существует это стандартное соглашение для Java, я полагал, что для C++ должно быть какое-то стандартное соглашение для решения этой проблемы; однако мои поиски в интернете не дали результатов.

Итак, мой вопрос, что такое конвенция? И если его нет, какой подход лучше?

1 ответ

Решение

В C++ нет понятия "пакет", поэтому технически невозможно "защитить пакет". (Есть предложение для модулей, но оно не будет включено даже в грядущий стандарт C++17).

Есть много способов скрыть класс от внешнего мира или ограничить доступ к нему, на уровне синтаксиса вы можете прибегнуть к:

  • ссылка на вложенные классы, которые могут быть объявлены закрытыми (вы должны быть знакомы с ними из Java, за исключением того, что по умолчанию они являются "статическими" и не могут получить доступ к нестатическим членам класса включения);
  • классы друзей, которые могут получить доступ к любым закрытым членам данной ссылки класса;
  • дружественные функции, если вы хотите ограничить доступ только к определенным функциям, включая функции-члены другого класса;
  • частное / защищенное наследование, где только члены класса знают о связи наследования.

Наличие большого количества классов и функций друзей - беспорядок, но есть причина требовать явного перечисления их: они нарушают принцип инкапсуляции.

Наконец, вы можете использовать идиому "частной реализации" (иначе pimpl, иначе непрозрачный указатель), который состоит в определении видимого класса, содержащего указатель на класс реализации, и переадресации всех вызовов, пока класс реализации определен в отдельном файле cpp или дизайн фасада.

Выберите то, что кажется подходящим для данного отношения класса. Стандартная библиотека предпочитает вложенные классы, в то время как Qt, популярная графическая библиотека, использует pimpl.

Другие вопросы по тегам