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