2010-12-09 17 views
11

Quiero tener dos estructuras que puedan contenerse entre sí. Aquí hay un ejemplo:Estructuras que se refieren entre sí

struct a { 
    struct b bb; 
}; 

struct b { 
    struct a aa; 
}; 

Pero este código no se compila. gcc dice:

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

¿Hay alguna manera de lograr esto?

Respuesta

20

¿Cómo se supone que funciona? a contendría b, que contendría a, que contendría b, etc ...

supongo que desee utilizar un puntero en su lugar?

struct b; 

struct a { 
    struct b *bb; 
}; 

struct b { 
    struct a *aa; 
}; 

Incluso aunque es un mal estilo de codificación, se deben evitar las dependencias circulares si es posible.

+7

No creo que sea necesariamente un mal estilo, después de todo, una lista simple 'struct' contendrá un puntero a sí mismo, que es aún más circular. – detly

+0

Muéstremelo ... – karlphillip

+2

@detly: me refiero a las dependencias circulares, es decir, dos clases que dependen unas de otras o que se señalan entre sí. http://en.wikipedia.org/wiki/Circular_dependency – EboMike

1

La forma habitual de tratar esto es hacerlos punteros y luego asignarlos dinámicamente o incluso simplemente asignar el puntero desde la dirección de una instancia estática de la otra estructura.

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; 
} 

Yo sugeriría, sin embargo, que busque una estructura en árbol. Quizás ambos objetos podrían apuntar a un tercer tipo común.

1

Esto no tiene sentido.

Imagínese si usted dice que cada X contiene una Y y cada Y contiene un X, a continuación, dentro de cada X es una Y que a su vez contiene un X, que a su vez contiene un Y, que a su vez contiene un X, ad infinitum.

su lugar, puede tener un X contienen una referencia a o (o puntero a ) una viceversa Y y.

4
struct a; 
struct b; 

struct a{ 
    struct b *bb; 
}; 

struct b{ 
    struct a *aa; 
}; 

La mayoría del archivo de encabezado declara la estructura antes de definir sus miembros. La definición de la estructura se definirá en otro lugar.

Cuestiones relacionadas