2010-12-09 8 views
11

Я хочу иметь две структуры, которые могут содержать друг друга. Вот пример:Структуры, которые ссылаются друг на друга

struct a { 
    struct b bb; 
}; 

struct b { 
    struct a aa; 
}; 

Но этот код не компилируется. gcc говорит:

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

Есть ли способ достичь этого?

ответ

20

Как это должно работать? a содержат бы b, которые содержат бы a, которые содержат бы b и т.д ...

Я полагаю, вы хотите использовать указатель вместо этого?

struct b; 

struct a { 
    struct b *bb; 
}; 

struct b { 
    struct a *aa; 
}; 

Даже если это плохой стиль кодирования - следует избегать круговых зависимостей, если это возможно.

+7

Я не думаю, что это обязательно плохой стиль. В конце концов, простой связанный список `struct` будет содержать указатель на себя, который еще круче. – detly 2010-12-09 01:37:39

1

Обычный способ борьбы с этим состоит в том, чтобы сделать их указателями, а затем динамически распределить их или даже просто назначить указатель из адреса статического экземпляра другой структуры.

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

Я бы предположил, однако, что вы ищете древовидную организацию. Возможно, оба объекта могут указывать на общий третий тип.

1

Это бессмысленно.

Представьте себе, если вы говорите, что каждый X содержит Y и каждый Y содержит X, то внутри каждого X является Y, который, в свою очередь, содержит X, который, в свою очередь, содержит Y, который, в свою очередь, содержит X, ad infinitum.

Вместо этого, вы можете иметь X содержать ссылку на или (или указатель на) в наоборот Y и.

4
struct a; 
struct b; 

struct a{ 
    struct b *bb; 
}; 

struct b{ 
    struct a *aa; 
}; 

Основная часть файла заголовка объявляет структуру перед определением ее членов. Определение структуры будет определено в другом месте.

Смежные вопросы