Концепция непрозрачных указателей
Часть раздела Объектно-ориентированное программирование путешествия по 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, но никогда напрямую с самой структурой.
Почему это важно? Поскольку фактическое определение struct скрыто в файле .c, никакой код, использующий ваш заголовочный файл, не может записать w->balance или sizeof(Wallet). Он должен использовать предоставленные вами функции. Вы контролируете весь доступ к данным и можете позже изменить внутреннюю структуру, не нарушив работу кода, который зависит от вашего заголовочного файла.
В следующем уроке ты потренируешься определять фактическое содержимое struct внутри исходного файла, завершая шаблон непрозрачного указателя.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C