2016-03-15 4 views
0

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

Как и в случае с этим стандартным соглашением для Java, я решил, что для этого требуется определенное стандартное соглашение для C++; однако мои поисковые запросы в Интернете не дали никаких результатов.

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

+0

Я не думаю, что есть что-либо * одинаковое *, но есть [*** классы друзей ***] (https://en.wikipedia.org/wiki/Friend_class). –

+1

Проверьте [ИИОМОМ PIMPL] (http://c2.com/cgi/wiki?PimplIdiom) –

+0

Это зависит от того, как именно используются классы клиентов. Можете быть более конкретными? – Galik

ответ

0

У C++ нет понятия «пакет», поэтому «защита пакетов» технически невозможна. (Существует предложение для модулей, но оно не будет включено даже в предстоящий стандарт C++ 17).

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

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

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

Наконец, вы можете использовать либо идиому «частной реализации» (aka pimpl, aka opaque pointer), которая заключается в определении видимого класса, содержащего указатель на класс реализации и переадресации всех вызовов, в то время как класс реализации определяется в отдельном cpp-файл или шаблон оформления фасада.

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

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

  • Нет связанных вопросов^_^