Непрозрачный указатель - Opaque pointer

В компьютерное программирование, непрозрачный указатель это частный случай непрозрачный тип данных, а тип данных объявлен указатель к записывать или же структура данных какого-то неустановленного типа.

Непрозрачные указатели присутствуют в нескольких языки программирования включая Ада, C, C ++, D и Модула-2.

Если язык строго типизированный, программы и процедуры у которых нет другой информации о типе непрозрачного указателя Т все еще могу заявить переменные, массивы, и поля записи типа Т, присвойте значения этого типа и сравните эти значения на предмет равенства. Однако они не смогут отказ от ссылки такой указатель, и может изменить содержимое объекта только путем вызова некоторой процедуры, имеющей недостающую информацию.

Непрозрачные указатели - это способ скрыть выполнение детали интерфейс от обычных клиентов, так что выполнение могут быть изменены без необходимости перекомпилировать модули используй это. Это также приносит пользу программисту, поскольку может быть создан простой интерфейс, а большинство деталей может быть скрыто в другом файле.[1] Это важно для обеспечения совместимость двоичного кода через разные версии общая библиотека, Например.

Этот метод описан в Шаблоны проектирования как Образец моста. Иногда его называют "ручка классы",[2] "Идиома Pimpl"(для" указателя на идиому реализации "),[3] "Идиома брандмауэра компилятора",[4] "d-указатель " или же "Чеширский кот", особенно среди сообщества C ++.[2]

Примеры

Ада

упаковка Library_Interface является   тип Ручка является ограничено частный;   - Операции ...частный   тип Скрытая реализация;    - Определяется в корпусе пакета   тип Ручка является доступ Скрытая реализация;конец Library_Interface;

Тип Ручка непрозрачный указатель на реальную реализацию, которая не определена в спецификации. Обратите внимание, что тип является не только частным (чтобы запретить клиентам доступ к типу напрямую и только через операции), но также и ограниченным (чтобы избежать копирования структуры данных и, таким образом, предотвратить висячие ссылки).

упаковка тело Library_Interface является   тип Скрытая реализация является записывать      ...    - Реальная реализация может быть любой   конец записи;   - Определение операций ...конец Library_Interface;

Эти типы иногда называют "Типы Taft"-названный в честь Такер Тафт, главный разработчик Ada 95 - потому что они были введены в так называемую поправку Taft к Ada 83.[5]

C

/ * obj.h * /структура объект;/* * Компилятор считает struct obj неполным типом. Неполные типы * можно использовать в объявлениях. */size_t obj_size(пустота);пустота obj_setid(структура объект *, int);int obj_getid(структура объект *);
/ * obj.c * /#включают "obj.h"структура объект {    int я бы;};/* * Вызывающий абонент будет обрабатывать выделение. * Укажите только необходимую информацию */size_t obj_size(пустота) {    возвращаться размер(структура объект);}пустота obj_setid(структура объект *о, int я) {    о->я бы = я;}int obj_getid(структура объект *о) {    возвращаться о->я бы;}

Этот пример демонстрирует способ достижения скрытие информации (инкапсуляция ) аспект объектно-ориентированного программирования используя язык C. Если кто-то хотел изменить определение struct obj, нет необходимости перекомпилировать любые другие модули в программе, которые используют obj.h заголовочный файл, если API тоже было изменено. Обратите внимание, что может быть желательно, чтобы функции проверяли, что переданный указатель не НОЛЬ, но для краткости выше такие проверки опущены.

C ++

/ * PublicClass.h * /#включают <memory>учебный класс PublicClass { общественный:  PublicClass();                               // Конструктор  PublicClass(const PublicClass&);             // Копируем конструктор  PublicClass(PublicClass&&);                  // Перемещаем конструктор  PublicClass& оператор=(const PublicClass&);  // Копируем оператор присваивания  PublicClass& оператор=(PublicClass&&);       // Переместить оператор присваивания  ~PublicClass();                              // Деструктор  // Прочие операции ... частный:  структура Чеширский кот;                   // Здесь не определено  стандартное::unique_ptr<Чеширский кот> d_ptr_;  // Непрозрачный указатель};
/ * PublicClass.cpp * /#включают "PublicClass.h"структура PublicClass::Чеширский кот {  int а;  int б;};PublicClass::PublicClass()    : d_ptr_(стандартное::make_unique<Чеширский кот>()) {  // Ничего не делать.}PublicClass::PublicClass(const PublicClass& Другой)    : d_ptr_(стандартное::make_unique<Чеширский кот>(*Другой.d_ptr_)) {  // Ничего не делать.}PublicClass::PublicClass(PublicClass&& Другой) = дефолт;PublicClass& PublicClass::оператор=(const PublicClass &Другой) {  *d_ptr_ = *Другой.d_ptr_;  возвращаться *это;}PublicClass& PublicClass::оператор=(PublicClass&&) = дефолт;PublicClass::~PublicClass() = дефолт;

Шаблон d-указателя - одна из реализаций непрозрачный указатель. Он обычно используется в классах C ++ из-за своих преимуществ (отмеченных ниже). D-указатель - это частный член данных класса, указывающий на экземпляр структуры. Этот метод позволяет объявлениям классов опускать частные данные-члены, за исключением самого d-указателя.[6] Как результат,

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

Одним из побочных преимуществ является то, что компиляция выполняется быстрее, потому что файл заголовка изменяется реже. Обратите внимание, что возможный недостаток шаблона d-указателя - косвенный доступ к члену через указатель (например, указатель на объект в динамическом хранилище), который иногда медленнее, чем доступ к простому члену, не являющемуся указателем. D-указатель широко используется в Qt [7] и KDE библиотеки.

Смотрите также

Рекомендации

  1. ^ Крис Маккиллоп. «Инструменты программирования - непрозрачные указатели». Программные системы QNX. Получено 2019-01-16.
  2. ^ а б Брюс Экель (2000). «Глава 5: Скрытие реализации». Мышление на C ++, Том 1: Введение в стандартный C ++ (2-е изд.). Прентис Холл. ISBN  0-13-979809-9.
  3. ^ Владимир Батов (25.01.2008). "Делаем Pimpl проще". Журнал доктора Добба. Получено 2008-05-07.
  4. ^ Херб Саттер. The Joy of Pimpls (или еще об идиоме компилятор-брандмауэр)
  5. ^ Роберт А. Дафф (29 июля 2002 г.). "Re: Как его снова зовут?". Группа новостейcomp.lang.ada. Получено 2007-10-11.
  6. ^ Использование d-указателя - Почему и как KDE реализует непрозрачные указатели
  7. ^ "D-указатель". Qt вики. Получено 23 декабря 2016.

внешняя ссылка