Compilerfehler bei friend-Klasse



  • Hallo,
    folgender Code (stark vereinfacht) compiliert nicht, Fehlermeldung s. Kommentar im Code. Es soll eine doppelt verkettete Liste sein, der Iterator soll die interne node-Darstellung kapseln.

    #include <string>
    class myClass; //forward Deklaration
    
    class myClass_iterator {
       public:
          //  Deklarationen
       private:
          myClass::node* iter; // <-- Fehler: Typ »myClass« 
                               //  ist nicht vom Typ »myClass_iterator« 
                               //  abgeleitet
    };
    
    class myClass {
          friend class myClass_iterator;
       public:
          typedef myClass_iterator iterator;
          // Deklarationen
       private:
          struct node {
             std::string content;
             iterator next, prev;
          };
          iterator first, last;
    };
    
    int main() {return 0;}
    

    Kann mir jemand helfen ???



  • Um auf Inhalte der Klasse myclass zugreifen zu können (in dem Fall die Sub-Klasse node), reicht die Forward Deklaration nicht aus - da brauchst du schon die volle Klassendefinition. Hier hast du allerdings das Problem, daß myclass::node auch die Definition des Iterators braucht.

    Eine Lösung wäre es, die Iterator-Klasse auch IN der myclass zu definieren (außerhalb hat sie sowieso keinen Nutzen).



  • Bin jetzt leicht verwirrt ... Meinst du so ??? :

    #include <string>
    class myClass {
       public:
          class iterator {
             public:
                //  Deklarationen
             private:
             node *iter; // <-- Fehler: ISO-C++ verbietet Deklaration von »node« ohne Typ
          };
    
          // Deklarationen
       private:
          struct node {
             std::string content;
             iterator next, prev;
          };
          iterator first, last;
    };
    
    int main() {return 0;}
    

    Das bringt allerdings weitere Fehlermeldung, s. Kommentar im Code.



  • Eine Declaration struct node;
    vor class iterator {} und es läuft. 😃



  • und vielleicht noch ein friend class myClass::iterator, wenn er meckert dass iterator kein node haben darf, da letzteres private in myClass ist...



  • Besten Dank 👍, hab's probiert, es compiliert. Für die Nachwelt halte ich noch die Lösung im Klartext fest 🙂

    #include <string>
    class myClass {
       private:
          struct node;
       public:
          class iterator {
             public:
                //  Deklarationen
             private:
             node *iter; // <-- Fehler: ISO-C++ verbietet Deklaration von »node« ohne Typ
          };
    
          // Deklarationen
       private:
          struct node {
             std::string content;
             iterator *next, *prev;
          };
          iterator first, last;
    };
    
    int main() {return 0;}
    

Log in to reply