Концепция непрозрачных указателей
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 17 из 61.
До сих пор, когда мы определяли struct в заголовочном файле, любой, кто подключает этот заголовок, может видеть и напрямую обращаться ко всем её членам. Это нарушает инкапсуляцию — принцип сокрытия внутренних деталей от внешнего кода.
C предоставляет мощную технику, называемую непрозрачными указателями, для решения этой проблемы. Идея проста: объявите, что struct существует в заголовке, но не раскрывайте, что находится внутри неё. Это делается с помощью неполного типа:
// wallet.h
typedef struct Wallet Wallet; // Только объявление — без тела!
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Обратите внимание, что здесь нет фигурных скобок — мы никогда не определяем, что содержит Wallet. Компилятор знает, что тип существует, но не знает его размер или поля. Это означает, что код, включающий этот заголовочный файл, может работать только с указателями на Wallet, но никогда с самой структурой напрямую.
Почему это важно? Поскольку само определение структуры скрыто в .c файле, любой код, использующий ваш заголовочный файл, не может написать w->balance или sizeof(Wallet). Он должен использовать функции, которые вы предоставляете. Вы контролируете весь доступ к данным и можете изменить внутреннюю структуру позже, не нарушая работу кода, который зависит от вашего заголовочного файла.
В следующем уроке вы попрактикуетесь в определении фактического тела структуры struct внутри исходного файла, завершая паттерн непрозрачного указателя (opaque pointer).
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигур