2016-09-21 1 views
1

J'ai un grand nombre de types de données distincts (processus, fichiers, threads, fonctions, etc.) qui sont définis dans des fichiers courts et simples .c/.h. Une fois que j'ai terminé la mise en œuvre des pièces individuelles et conclu les tests de couverture d'unité/code, je suis passé à la connexion des pièces ensemble.struct avec pointer-to-parent-struct: meilleure approche

L'implémentation actuelle utilise pointeur-à-parents- struct via (void *) pointeurs dans le code, à savoir:

struct typeB { 
    int B; 
    void *parent; 
}; 

struct typeC { 
    int C; 
    void *parent; 
}; 

struct typeA { 
    int a; 
    struct typeB *pB; 
    struct typeC *pC; 
}; 

J'utilisé void * pointeurs en raison de la façon dont certains struct s sont compliquées, et ils ne seront pas compiler si j'utilise réelle pointer-to-struct-type à la place de void *.

Il existe quelques fonctions où typeB et typeC doivent se parler, mais elles sont rares. En outre, ces deux struct n'ont jamais besoin de connaître int a dans le parent.

je pouvais supprimer les parent struct pointeurs et factoriser mes prototypes de fonction/définitions à de simples accepter tous (struct typeA *) comme argument, accéder aux sous-structures, etc., mais il semble exagéré, car plusieurs fonctions juste besoin d'avoir accès à typeB/typeC structures et leurs éléments. Existe-t-il une norme de facto (non-cargo-cult-programming) pour gérer une telle organisation de structures (similaire à la règle "ne pas lancer malloc()" que je vois si souvent sur ce site)?

Merci.

+1

Déclarations avancées. Utilise les. –

+0

@ n.m. C'est suffisant. Au-delà de cela, y a-t-il des soucis importants avec l'utilisation de la logique pointeur vers parent-struct? Je vous remercie. – DevNull

+0

Si vous essayez d'implémenter l'héritage, assurez-vous d'aligner le pointeur parent à la 0e partie de la structure afin que le décalage soit 0 –

Répondre

2

J'utilise des pointeurs void * en raison de la complexité des struct sont, et ils ne compilera pas si j'utiliser un pointeur à struct-type réel à la place de void *.

Et quel est le problème avec les déclarations anticipées?

struct typeA; // forward declaration 

struct typeB { 
    int B; 
    struct typeA *parent; 
}; 

struct typeC { 
    int C; 
    struct typeA *parent; 
}; 

struct typeA { 
    int a; 
    struct typeB *pB; 
    struct typeC *pC; 
}; 

À partir de votre question: Si vous ne voulez pas/stocker paren dans le cadre de la structure alors vous aurez besoin soit

a) pour passer l'adresse mère en tant que paramètre, en effet, ou

b) pour définir une variable statique comme et y mettre l'adresse de la structure parente avant d'appeler toute méthode fonctionnant avec des enfants.

La dernière solution n'est pas sûre pour les threads et est sujette aux erreurs.