View Full Version : [C] Struttura opaca di contesto
Salve a tutti,
ho trovato un problema di programmazione C in Linux una frase del genere:
"Creare un puntatore a una struttura opaca di contesto..."
La domanda è: cosa è questa struttura opaca di contesto? Qualcuno può spiegarmelo o darmi qualche riferimento dove potermi informare?
Grazie in anticipo,
Daniele
ho trovato in un esercizio in rete sulla programmazione C in Linux una frase del genere:
"Creare un puntatore a una struttura opaca di contesto..."
La domanda è: cosa è questa struttura opaca di contesto? Qualcuno può spiegarmelo o darmi qualche riferimento dove potermi informare?Nulla di complicato.
Nei linguaggi ad oggetti (C++, Java ecc...) è possibile creare degli oggetti che contengono dei dati (variabili di istanza o variabili "membro") che possono essere marcati 'private' (anche 'protected' se visibili dalle sottoclassi), comunque non visibili all'esterno da chi poi usa l'oggetto.
In "C" questo non è possibile. La cosa che più si avvicina ad una classe è una struttura ma .... in ogni caso ciò che sta dentro la struttura è sempre pubblico.
Prendiamo, per fare un esempio, il ben noto tipo FILE* usato con la libreria stdio.h. FILE è a tutti gli effetti una struttura ma definita "opaca". Il programmatore può ricevere un FILE* da una fopen, può passare tale puntatore alle altre funzioni della stdio ma .... non deve "ficcare il naso" dentro la struttura. Un FILE* rappresenta quindi il "contesto" legato ad un file aperto.
In sostanza, usare una "struttura opaca" significa fare in modo che il programmatore possa usare una struttura (in genere attraverso un puntatore) ma senza dover/poter toccarne il contenuto.
Ora ... come ho detto all'inizio, i dati di una struttura sono sempre "pubblici", quindi visto che FILE è a tutti gli effetti direttamente una struttura, tecnicamente basterebbe andare a sbirciare negli include della stdio per vedere (e magari usare) i suoi campi. Sebbene ciò non si debba mai fare!
Se si vuole rendere "invisibile" il contenuto della struttura in genere si dà in pasto all'utilizzatore un semplice puntatore void*, magari "travestito" da tipo particolare.
gestione.h
typedef void* MIOHANDLE;
MIOHANDLE crea_contesto (....);
void usa_contesto (MIOHANDLE handle);
gestione.c
typedef struct
{
....
} MIA_STRUCT;
MIOHANDLE crea_contesto (....)
{
MIA_STRUCT *ptr;
ptr = (MIA_STRUCT*) malloc (sizeof (MIA_STRUCT));
....
return (MIOHANDLE) ptr;
}
void usa_contesto (MIOHANDLE handle)
{
MIA_STRUCT *ptr = (MIA_STRUCT*) handle;
....
}
Chi userà le funzioni del sorgente "vedrà" e userà solamente un tipo MIOHANDLE (che poi è un banale void*) quindi potrà usare il contesto gestito dal sorgente ma senza poter manipolare il contenuto della struttura.
Spero che la mia spiegazione sia chiara. ;)
Grazie, la tua spiegazione è stata molto esauriente! Credo di avere capito, se poi mi viene qualche altro dubbio, riposterò.
Daniele
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.