Spesso per convenzione un membro privato ha un carattere di sottolineatura extra nel nome o qualcosa come _pri
aggiunto. O forse un commento. Questa tecnica non esegue il controllo applicato dal compilatore per assicurarsi che nessuno acceda in modo inappropriato a quei campi, ma serve da avvertimento a chiunque legga una dichiarazione struct
che i contenuti siano dettagli di implementazione e che non debbano dare loro un'occhiata.
Un'altra tecnica comune è esporre la struttura come un tipo incompleto. Ad esempio, nel file di intestazione, si potrebbe avere:
struct my_struct;
void some_function(struct my_struct *);
E nella realizzazione, o qualche colpo di testa interna che non è accessibile per i consumatori della biblioteca, si ha:
struct my_struct
{
/* Members of that struct */
};
Puoi anche fare trucchi simili con puntatori void, che ottengono il cast nel punto giusto nella porzione "privata" del codice. Questo approccio perde una certa flessibilità (ad esempio, non è possibile avere un'istanza allocata nello stack di un tipo non definito), ma ciò potrebbe essere accettabile.
Se si desidera un insieme di membri pubblici e privati, è possibile fare la stessa cosa di sopra, ma memorizzare il puntatore di struct privato come membro di quello pubblico e lasciarlo incompleto nei consumatori pubblici della libreria .
Anche se questo introduce qualche riferimento indiretto, che può compromettere le prestazioni. Ci sono alcuni (in genere non portabile, ma lavorerà su compilatori ragionevoli) TYPE-gioco di parole trucchi che si possono usare anche:
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;
}
Questo presuppone anche che non è possibile memorizzare questi oggetti nello stack o in custodia statica , o ottenere le dimensioni al momento della compilazione.
Il nascondiglio e l'incapsulamento delle informazioni precedono l'OOD. –