Konzept der Opaque Pointers
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 17 von 61.
Bisher konnte jeder, der eine Header-Datei einbindet, in der wir ein struct definieren, alle seine Member sehen und direkt darauf zugreifen. Dies verletzt die Kapselung – das Prinzip, interne Details vor externem Code zu verbergen.
C bietet eine leistungsstarke Technik namens Opaque Pointers, um dies zu lösen. Die Idee ist einfach: Deklarieren Sie im Header, dass ein struct existiert, aber verraten Sie nicht, was sich darin befindet. Dies geschieht mithilfe eines unvollständigen Typs:
// wallet.h
typedef struct Wallet Wallet; // Nur Deklaration - kein Rumpf!
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Beachten Sie, dass es keine geschweiften Klammern gibt – wir definieren nie, was Wallet enthält. Der Compiler weiß, dass der Typ existiert, aber nicht seine Größe oder seine Member. Das bedeutet, dass Code, der diesen Header einbindet, nur mit Pointern auf Wallet arbeiten kann, niemals mit dem Struct selbst direkt.
Warum ist das wichtig? Da die eigentliche Struct-Definition verborgen in der .c-Datei liegt, kann jeglicher Code, der Ihren Header verwendet, nicht w->balance oder sizeof(Wallet) schreiben. Er muss die von Ihnen bereitgestellten Funktionen verwenden. Sie kontrollieren den gesamten Zugriff auf die Daten und können die interne Struktur später ändern, ohne Code zu beschädigen, der von Ihrem Header abhängt.
In der nächsten Lektion werden Sie üben, den eigentlichen struct-Body innerhalb der Quelldatei zu definieren und so das Opaque-Pointer-Pattern zu vervollständigen.
Spickzettel
Ein opaker Zeiger verwendet einen unvollständigen Typ, um Implementierungsdetails von Strukturen zu verbergen und so die Kapselung zu erzwingen.
Deklarieren Sie die Struktur im Header, ohne ihren Körper zu definieren:
// wallet.h
typedef struct Wallet Wallet; // Nur Deklaration - keine geschweiften Klammern
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Der Compiler weiß, dass der Typ existiert, aber nicht seine Größe oder seine Member. Benutzer können nur mit Zeigern auf die Struktur arbeiten und müssen bereitgestellte Funktionen verwenden, um mit ihr zu interagieren.
Die eigentliche Strukturdefinition wird in der .c-Datei platziert, was den direkten Zugriff auf Member wie w->balance oder die Verwendung von sizeof(Wallet) verhindert.
Probier es selbst
Diese Lektion enthält keine Programmieraufgabe.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-Implementierung