PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++]Einfach verkettete List und Iterator



peg
08-01-2007, 16:56
Hallo!
Es geht um eine einfach verkettete Liste, die mit einem Iterator versehen werden soll... leider spuckt g++ (v 4.0.2-5 Linux) folgende Meldung beim Compilieren aus:


List.h:15: error: 'Iterator' does not name a type
List.h:16: error: 'Iterator' does not name a type
List.cc:126: error: no 'Iterator List::anfang()' member function declared in class 'List'
List.cc:133: error: no 'Iterator List::ende()' member function declared in class 'List'
List.h:15: error: 'Iterator' does not name a type
List.h:16: error: 'Iterator' does not name a type


Hier die .h und Auszüge aus der .cc Datei:
list.h


#ifndef LIST_H
#define LIST_H
class List
{
friend class Iterator;
public:
List();
~List();
void insert(int i);
void erase(int i);
void eraseAll(int i);
void show();
int isIn(int i);

Iterator anfang(); // Fehler
Iterator ende(); // Fehler

private:
class Node
{
public:
Node();
Node(int i, Node * n);
~Node();
int v;
Node * next;
};
void erase_r(int i, Node * &i);
Node * head;
};

class Iterator
{
friend class List;
public:
void geheWeiter();
int & aktElement();
private:
List::Node * aktPos;
};
#endif

list.cc


....
void Iterator::geheWeiter ()
{
aktPos = aktPos->next;
}

int & List::aktElement ()
{
return aktPos->v;
}

Iterator List::anfang()
{
Iterator res;
res.aktPos = anfang;
return res;
}

Iterator List::ende()
{
Iterator res;
res.aktPos = 0;
return res;
}
....

Laut einem Script von meinem Prof sollte das so funktionieren. Sieht einer den Fehler?
Ich wäre für jede Hilfe sehr dankbar :)

mfg

panzi
08-01-2007, 18:37
Ein #include "list.h" gibts in list.cc?
Event gibts Probleme mit den Namen des headers und der alten STL file list.h (jetzt heißt sie ja nur noch list, ohne .h). Probier mal andere Dateinamen aus.

Vincent Vega
08-01-2007, 18:41
Du brauchst eine Forward-Deklaration für Iterator.




class Iterator;

class List {

...

};


Evtl. kannst Du dann anfang und ende nicht als Objekt in der Klasse Iterator deklarieren, sondern musst Zeiger nehmen, da bin ich mir im Moment nicht so sicher

bmann
08-01-2007, 18:43
Hi
in der Klasse "List" ist die Klasse "Iterator" noch nicht bekannt, da diese ja erst anschliessend deklariert wird.

Da du die Deklaration von Iterator nicht vorziehen kannst (da Iterator List benutzt), musst du eine Forward Deklaration benutzen. Setze die Zeile


class Iterator;

vor die Deklaration von List (d.h. in der .h Datei).

CU
Andi

peg
09-01-2007, 09:06
Vielen Dank! Funktioniert.... Manchmal sieht man den Wald vor lauter Bäumen nich :)

anda_skoa
10-01-2007, 22:33
Das gemeine ist, daß sich manche (besonders ältere) Kompiler teilweise mit der friend Deklarations zufrieden geben (weil die ja praktisch eine Forward declaration "enthält") :)

Ciao,
_