Problem mit Strukturen



  • Ich habe das Problem, dass ich zwei Strukturen habe, und beide sollen jeweils eine Variable mit dem Datentyp der anderen Struktur haben.

    So ungefähr:

    struct S1{
    S2 Var;
    };
    
    struct S2{
    S1 Var;
    };
    

    Nun gibts das Problem, dass der Compiler S2 oben ja noch gar nicht kennt, da S2 ja erst darunter definiert wird... 😕

    wie kann ich das umgehen???

    Ich hätte da die Idee, obs auch ne Deklaration für Strukturen gibt, (bestimmt!)
    aber bei mir hat google an der Stelle versagt...

    Danke für Antworten!



  • Das geht nicht. Das wäre ja wie eine Matroschka, die man unendlich oft auspacken kann... mindestens eine der beiden Strukturen darf die andere nur als Zeiger enthalten, und dann kannst du Vorwärtsdeklarationen verwenden:

    struct S2;
    struct S1 {
      S2 *s2;
    };
    
    struct S2 {
      S1 s1;
    };
    


  • Das geht in der Form nicht, weil deine Structs so unendlich groß würden. Man kann eine Tasche nicht in sich selbst stopfen, auch (und ganz besonders) wenn man sie vorher in einem Koffer verstaut hat.

    Was du machen kannst, ist Folgendes:

    struct S2; // forward declaration
    
    struct S1 {
      S1();
      ~S1();
    
      std::unique_ptr<S2> Var;
    };
    
    struct S2 {
      S2();
      ~S2();
    
      std::unique_ptr<S1> Var;
    };
    
    S1::S1() : Var(new S2) { }
    S1::~S1() { }
    
    S2::S2() : Var(new S1) { } // Aber...
    S2::~S2() { }
    

    So wird das kompilieren. Und abstürzen, wenn die Endlosschleife im Konstruktor den ganzen Speicher aufgefressen hat.



  • Oh, ich merk grade, dass ich mal wieder etwas viel komplizierter lösen wollte, als es eigentlich ist:

    struct S1{
    
    //Viiiiieeeele statische Member :D
    };
    
    struct S2{
    void Greifezu();
    };
    
    void S2::Greifezu(){
    //So wollte ichs Dummerweise lösen:
    S2 Muh;
    int Oink = Muh.Flubb;
    
    //Viel einfacher:
    int Oink = S2::Flubb;
    }
    

    Das Problem war, dass ich Greifzu() ca. 65 mal in der Sekunde aufgerufen wird, sodass das ständige Riesen-variable erstellen total bremsen würde.
    dann kam ich auf die idee, die Variable als Member zu setzten, aber so ist es viiiiel einfacher 🙂

    Trotzdem Danke für die Antworten!


Log in to reply