Menu
Coddy logo textTech

Концепция непрозрачных указателей

Часть раздела Объектно-ориентированное программирование путешествия по 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 внутри исходного файла, завершая шаблон непрозрачного указателя.

Попробуйте сами

В этом уроке нет задания по программированию.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C