Menu
Coddy logo textTech

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

Часть раздела 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).

Шпаргалка

Непрозрачный указатель (opaque pointer) использует неполный тип для скрытия деталей реализации структуры, обеспечивая инкапсуляцию.

Объявите структуру в заголовочном файле, не определяя её тело:

// wallet.h
typedef struct Wallet Wallet;  // Только объявление — без фигурных скобок

Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);

Компилятор знает о существовании типа, но не о его размере или членах. Пользователи могут работать только с указателями на структуру и должны использовать предоставленные функции для взаимодействия с ней.

Фактическое определение структуры помещается в файл .c, что предотвращает прямой доступ к членам, таким как w->balance, или использование sizeof(Wallet).

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

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

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

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

Все уроки раздела Object Oriented Programming