Konventionell hat ein privates Mitglied einen zusätzlichen Unterstrich in seinem Namen oder so etwas wie _pri
angehängt. Oder möglicherweise ein Kommentar. Diese Technik führt keine durch den Compiler erzwungene Überprüfung durch, um sicherzustellen, dass niemand unangemessen auf diese Felder zugreift, sondern dient als Warnung für alle, die eine struct
Deklaration lesen, dass die Inhalte Implementierungsdetails sind und sie nicht sehen oder anstupsen sollten.
Eine andere übliche Technik besteht darin, Ihre Struktur als unvollständigen Typ zu offenbaren. Zum Beispiel in der Header-Datei, die Sie haben könnten:
struct my_struct;
void some_function(struct my_struct *);
Und in der Umsetzung, oder einige interne Header, die nicht zugänglich für die Verbraucher der Bibliothek ist, haben Sie:
struct my_struct
{
/* Members of that struct */
};
können Sie mache auch ähnliche Tricks mit Void-Zeigern, die im "privaten" Teil des Codes an die richtige Stelle geworfen werden. Dieser Ansatz verliert an Flexibilität (Sie können z. B. keine stack-allokierte Instanz eines nicht definierten Typs haben), aber das kann akzeptabel sein.
Wenn Sie eine Mischung aus privaten und öffentlichen Mitgliedern haben möchten, können Sie dasselbe wie oben ausführen, aber den privaten Strukturzeiger als Mitglied des öffentlichen Elements speichern und in öffentlichen Benutzern der Bibliothek unvollständig lassen .
Obwohl dies eine gewisse Indirektion mit sich bringt, die die Leistung beeinträchtigen kann. Es gibt einige (in der Regel nicht tragbar, aber funktioniert auf vernünftigen Compiler) Typ-punning Tricks Sie können auch verwenden:
struct public_struct
{
int public_member;
int public_member2;
/* etc.. */
};
struct private_struct
{
struct public_struct base_members;
int private_member1;
int private_member2;
};
void some_function(struct public_struct *obj)
{
/* Hack alert! */
struct private_struct *private = (struct private_struct*)obj;
}
Dies geht auch davon aus, dass Sie nicht diese Objekte auf dem Stapel oder in statischen Speicher speichern kann, oder die Größe zur Kompilierzeit erhalten.
Informationsverbergung und -verkapselung ist älter als OOD. –