Menu
Coddy logo textTech

Concept des pointeurs opaques

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 17 sur 61.

Jusqu'à présent, lorsque nous définissons une struct dans un fichier d'en-tête, quiconque inclut cet en-tête peut voir et accéder directement à tous ses membres. Cela rompt l'encapsulation — le principe consistant à masquer les détails internes au code externe.

Le C fournit une technique puissante appelée pointeurs opaques pour résoudre ce problème. L'idée est simple : déclarer qu'une struct existe dans le header, mais ne pas révéler ce qu'elle contient. Ceci est réalisé en utilisant un type incomplet :

// wallet.h
typedef struct Wallet Wallet;  // Déclaration uniquement - pas de corps !

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

Remarquez qu'il n'y a pas d'accolades — nous ne définissons jamais ce que Wallet contient. Le compilateur sait que le type existe, mais pas sa taille ni ses membres. Cela signifie que le code qui inclut cet en-tête ne peut travailler qu'avec des pointeurs vers Wallet, jamais avec la structure elle-même directement.

Pourquoi est-ce important ? Parce que la définition réelle de la structure (struct) est cachée dans le fichier .c, tout code utilisant votre en-tête ne peut pas écrire w->balance ou sizeof(Wallet). Il doit utiliser les fonctions que vous fournissez. Vous contrôlez tout accès aux données, et vous pouvez modifier la structure interne plus tard sans casser le code qui dépend de votre en-tête.

Dans la prochaine leçon, vous vous entraînerez à définir le corps réel de la struct à l'intérieur du fichier source, complétant ainsi le modèle de pointeur opaque (opaque pointer pattern).

Aide-mémoire

Un pointeur opaque utilise un type incomplet pour masquer les détails d'implémentation d'une structure, renforçant ainsi l'encapsulation.

Déclarez la structure dans l'en-tête sans définir son corps :

// wallet.h
typedef struct Wallet Wallet;  // Déclaration uniquement - pas d'accolades

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

Le compilateur sait que le type existe, mais ne connaît ni sa taille ni ses membres. Les utilisateurs ne peuvent travailler qu'avec des pointeurs vers la structure et doivent utiliser les fonctions fournies pour interagir avec elle.

La définition réelle de la structure est placée dans le fichier .c, empêchant l'accès direct aux membres comme w->balance ou l'utilisation de sizeof(Wallet).

Essayez vous-même

Cette leçon ne comprend pas de défi de code.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming