Rekursive Definitionen



  • Hallo Freunde,

    Beispiel:

    class Class1
    {
     Class1(Class2* p_Class2);
    }
    
    class Class2
    {
     Class2(Class1* p_Class1);
    }
    

    Gibts n hübschen Artikel zu diesem Thema? Welche Lösungsansätze es gibt, und was welche Vorteile/Nachteile hat?

    Bei

    class Class2;
    
    class Class1
    {
     Class1(Class2* p_Class2);
    }
    
    class Class2
    {
     Class2(Class1* p_Class1);
    }
    

    Krieg ich z.B. vom Compiler eine Warnung, wenn ich z.B. in Class1 einen Class2 Pointer delete.



  • Du kannst schonmal nicht paarweise ein Objekt einer anderen Klassen darin einbetten.
    Mit Pointern müsste das aber gehen! Was willst du genau wissen? Was ist dein Nutzen?



  • Kannst du dein Problem detaillierter beschreiben? Was genau möchtest du lösen? Zirkuläre Beziehungen sind vom Design her an sich nicht so schön, aber manchmal geht es nicht anders. Konkrete Lösungen kann man da nur für konkrete Problemstellungen geben.

    Und wieso sollte der Compiler dich warnen, wenn du in Class1 einen Class2 Pointer freigibst? Das ist doch völlig legal.



  • Ich weiß nicht ganz was du willst. Das Erste ist überhaupt kein valides C++. Das Zweite nur unter der Bedingung, dass du die Methoden von Class1 die Class2 verwenden erst definierst, wenn Class2 ebenso definiert wurde.

    Du wirst bei deiner Warnung sicherlich sowas in der Art gemacht haben:

    class Class2;
    
    class Class1
    {
     Class1(Class2* p_Class2){
       delete p_Class2;//ganz falsch!
     }
    }
    

    Das ist so nicht erlaubt, da delete die Definition von Class2 braucht. Eine Vorwärtsdeklaration reicht nicht aus.

    Im Vergleich ist das korrekt:

    class Class2;
    
    class Class1
    {
     Class1(Class2* p_Class2);
    }
    
    class Class2
    {
     Class2(Class1* p_Class1);
    } 
    
    //später...
    Class1::Class1(Class2* p_Class2){
        delete p_Class2;//jetzt ist es erlaubt, da der Compiler hier Class2 bereits kennt!
    }
    


  • Ausgezeichnet, vielen Dank. Den delete Aufruf hatte ich tatsächlich in einer member Funktion in einem inline innerhalb der header.

    Habe die Stelle bis jetzt noch nicht getestet. Aber vielen Dank, ich schieb das gleich dann in die cpp.


Anmelden zum Antworten