Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Скрыть приватную область класса


Автор: semibug 9.1.2011, 11:33
В заголовочном файле находится объявление класса.
В приватной секции используются типы, описанные в другом заголовочном файле (TerribleDefs.h). Пользователи класса используют публичные функции-члены, но вынуждены так же иметь доступ к модулю TerribleDefs.h.
Варианты:
  - создать дополнительный класс-интерфейс, в котором будут описаны только публичные методы, и от него наследовать рабочий класс, пользователям достаточно включения только класса интерфейса.
  - в заголовочном файле, в описании класса, в приватных секциях использовать типы void*, в реализации приводить к нужным.

Оба способа, imho, не попадают под определение "элегантный".
Как обходитесь в такой ситуации вы?

Автор: azesmcar 9.1.2011, 11:42
http://en.wikipedia.org/wiki/Opaque_pointer

Автор: semibug 9.1.2011, 12:15
azesmcar, гуд, спасибо!

Автор: Earnest 10.1.2011, 11:50
На мой взгляд, первый вариант (отделить интерфейс) вполне элегантный и практически эквивалентен варианту PIMPL. Выбор зависит от задачи, доп. условий и личных предпочтений. Доп. условия - это, например: 
- желательно не использовать виртуальные функции -> используем PIMPL;
- есть легкое ощущение, что в будущем потребуются различные реализации -> интерфейс.

Кстати, под "интерфейсом" можно понимать не только набор чисто-виртуальных функций. Например, есть набор параметров какого-либо процесса, с которым удобнее работать как со структурой. Но использующему ее коду совершенно не нужно знать как эти данные хранятся и добываются. В таком случае я объявляю в интерфейсном файле структуру с нужными полями и статической функцией Instanсe, возможно с параметром. А реализуется этот набор параметров как производная от какого-нибудь класса, который умеет храниться в профиле или где-то еще... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)