2010-12-09 27 views
11

Je veux avoir deux structures qui peuvent se contenir les unes les autres. Voici un exemple:Structures qui se réfèrent

struct a { 
    struct b bb; 
}; 

struct b { 
    struct a aa; 
}; 

Mais ce code ne compile pas. gcc dit:

test.c:3: error: field ‘bb’ has incomplete type 

Y at-il un moyen d'y parvenir?

Répondre

20

Comment cela est-il censé fonctionner? a contiendrait b, qui contiendrait a, qui contiendrait b, etc ...

Je suppose que vous voulez utiliser un pointeur à la place?

struct b; 

struct a { 
    struct b *bb; 
}; 

struct b { 
    struct a *aa; 
}; 

Même si c'est un mauvais style de codage - les dépendances circulaires devraient être évitées si possible.

+7

Je ne pense pas que ce soit forcément un mauvais style - après tout, une simple liste chaînée 'struct' contiendra un pointeur sur lui-même, qui est encore plus circulaire. – detly

+0

Battez-moi dessus .. – karlphillip

+2

@detly: Je fais référence aux dépendances circulaires, c'est-à-dire deux classes dépendant l'une de l'autre ou pointant l'une vers l'autre. http://en.wikipedia.org/wiki/Circular_dependency – EboMike

1

La façon habituelle de traiter cela est de les rendre pointeurs, puis de les allouer dynamiquement ou même simplement d'attribuer le pointeur à partir de l'adresse d'une instance statique de l'autre structure.

struct a { 
    struct b *bb; 
}; 

struct b { 
    struct a *aa; 
}; 

struct a a0; 
struct b b0; 

void f(void) { 
    a0.bb = &b0; 
    b0.aa = &a0; 
} 

Je suggérerais, cependant, que vous recherchiez une organisation arborescente. Peut-être que les deux objets pourraient pointer vers un troisième type commun.

1

Cela n'a aucun sens.

Imaginez si vous dites que chaque X contient une Y et chaque Y contient un X, puis à l'intérieur de chaque X est un Y qui à son tour contient un X, qui à son tour contient une Y, qui à son tour contient une X, ad infinitum.

Au lieu de cela, vous pouvez avoir un X contiennent une référence - ou (ou pointeur vers) un Y et vice-versa.

4
struct a; 
struct b; 

struct a{ 
    struct b *bb; 
}; 

struct b{ 
    struct a *aa; 
}; 

La plupart des fichiers d'en-tête déclarent la structure avant de définir ses membres. La définition de la structure sera définie ailleurs.