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).

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

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

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

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

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