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.
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
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle