Strukturen, die aufeinander verweisen

Lesezeit: 2 Minuten

Ich möchte zwei Strukturen haben, die sich gegenseitig enthalten können. Hier ist ein Beispiel:

struct a {
  struct b bb;
};

struct b {
  struct a aa;
};

Aber dieser Code wird nicht kompiliert. gcc sagt:

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

Gibt es eine Möglichkeit, dies zu erreichen?

Wie soll das funktionieren? a enthalten würde bwas enthalten würde awas enthalten würde betc…

Ich nehme an, Sie möchten stattdessen einen Zeiger verwenden?

struct b;

struct a {
  struct b *bb;
};

struct b {
  struct a *aa;
};

Auch das ist schlechter Programmierstil – zirkuläre Abhängigkeiten sollten nach Möglichkeit vermieden werden.

  • Ich denke nicht, dass es unbedingt schlechter Stil ist – immerhin eine einfache verknüpfte Liste struct enthält einen noch kreisförmigeren Zeiger auf sich selbst.

    – dezent

    9. Dezember 2010 um 1:37 Uhr

  • @detly: Ich beziehe mich auf zirkuläre Abhängigkeiten, dh zwei Klassen, die voneinander abhängig sind oder aufeinander zeigen. en.wikipedia.org/wiki/Circular_dependency

    – EboMike

    9. Dezember 2010 um 1:40 Uhr

  • @sjf – Gehen Sie zum Reißbrett und schauen Sie sich an, wie Ihre Struktur aussehen soll. ‘b’ enthält im Wesentlichen ein aaber a enthält ein b. Was erwartest du, dass es in Erinnerung bleibt? Was versuchst du zu erreichen?

    – EboMike

    9. Dezember 2010 um 1:41 Uhr

  • Okay, lassen Sie mich hier eine Analogie versuchen. Sie stellen eine Kiste in einen Eimer, und Sie stellen den Eimer in die Kiste. Stell dir das vor.

    – EboMike

    9. Dezember 2010 um 1:44 Uhr

  • Sie haben mindestens 1 Zeiger (technisch gesehen kann Struct b a enthalten, nicht unbedingt a*) .

    – a1ex07

    9. Dezember 2010 um 1:45 Uhr

Benutzer-Avatar
Muturaman

struct a;
struct b;

struct a{
   struct b *bb;
};

struct b{
   struct a *aa;
};

Die meisten Header-Dateien deklarieren die Struktur, bevor ihre Mitglieder definiert werden. Die Strukturdefinition wird an anderer Stelle definiert.

Der übliche Weg, damit umzugehen, besteht darin, sie zu Zeigern zu machen und sie dann dynamisch zuzuweisen oder den Zeiger einfach von der Adresse einer statischen Instanz der anderen Struktur zuzuweisen.

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

Ich würde jedoch vorschlagen, dass Sie nach einer baumstrukturierten Organisation suchen. Vielleicht könnten beide Objekte auf einen gemeinsamen dritten Typ hinweisen.

Das ist unsinnig.

Stell dir vor, du sagst das jeden X enthält ein Y Und jeder Y enthält ein Xdann in jedem X ist ein Y die wiederum eine enthält Xdie wiederum eine enthält Ydie wiederum eine enthält X, Ad infinitum.

Stattdessen können Sie eine haben X enthalten a Bezug auf oder oder Zeiger auf) a Y und umgekehrt.

1368140cookie-checkStrukturen, die aufeinander verweisen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy