Implementa l'ereditarietà in C

2

Lavoravo con GTK in uno dei miei progetti e ho notato che la libreria supporta l'ereditarietà. Come puoi digitare, puoi lanciare una struttura figlia nella sua struttura principale e viceversa. Altro che GTK non l'ho mai visto usato (in modo impeccabile):

struct parent p = {5};
struct child c;
c = (struct child)p;
c.b = 1;

L'uso della struttura padre come primo elemento lo fa? Come questo sembrerebbe molto più pulito. Ma il padding e l'allineamento potrebbero interferire?

struct parent { int a; }
struct child  { struct parent p; int b; } 

Oppure riscrive tutti i dati principali?

struct parent { int a; }
struct child  { int a; int b; }
    
posta Sanchke Dellowar 27.12.2016 - 16:42
fonte

2 risposte

3

Per motivi di manutenzione, scegli la prima soluzione di ereditare la struttura principale. Essendo il linguaggio C molto blando con la programmazione sicura per tipo, è quindi sicuro passare la nuova struttura come puntatore cast a una funzione di base usando il genitore. Il vantaggio è che l'aggiunta di un membro nel genitore non richiederà la modifica di tutti i discendenti. Come nota a margine, questo è anche ciò che fanno diverse implementazioni C ++, ripetendo automaticamente i membri invece di aggiungere un livello di dereferimento per ciascun livello di ereditarietà.

Come vecchio trucco, puoi anche aggiungere le definizioni del preprocessore per consentire l'utilizzo dei tipi di base:

struct parent {
  int parent_i;
  char parent_c;
};

struct descendant {
  struct parent parent_data;
  int descendant_d;
};
#define descendant_i parent_data.parent_i
#define descendant_c parent_data.parent_c

Questo è ciò che viene fatto nelle strutture socket (controlla sock_addr). Nel fare ciò, assicurati di avere uno spazio dei nomi appropriato per i membri della struttura.

    
risposta data 29.12.2016 - 11:20
fonte
0

È meglio ripetere i campi comuni piuttosto che includere una struttura nell'altra, a causa delle regole per il layout dei campi e degli scenari in cui la lingua è definita da ospitare.

Tuttavia, puoi rifattorizzare diversi campi comuni in una struttura separata che viene quindi inclusa da entrambi / tutti gli altri, che ora segue il consiglio precedente.

Si noti che l'esempio che viene fornito crea una struttura, che è un po 'insolita. Più previsto sarebbe il cast di puntatore a struct in pointer a (another) struct.

E come dice @RobertHarvey, C sarà molto tollerante nel scrivere codice non sicuro e potenzialmente buggato.

    
risposta data 27.12.2016 - 18:06
fonte

Leggi altre domande sui tag