[C++] Tworzenie iteratora do własnego kontenera na dane
Ostatnio zmodyfikowano 2013-03-28 09:30
fers334 Temat założony przez niniejszego użytkownika |
[C++] Tworzenie iteratora do własnego kontenera na dane » 2013-03-27 20:52:30 Siemka mam problem nie wiem w czym robie bład wszystko robiłem z 2 miesiace temu i widocznie zapomnialem co nieco prosze o pomoc co w kodzie jest bledne ?
Oto kod :
plik lista.h
#ifndef lista_H #define lista_H
#include <iostream> #include "iteratorL.h"
class lista { private: friend class iteratorX; struct wezel { char dana; wezel * wsk_next; wezel * wsk_poprz; wezel() : dana( 0 ) , wsk_next( 0 ) , wsk_poprz( 0 ) { } }; wezel * pierwszyW; wezel * ostatniW; public: lista() : pierwszyW( 0 ) , ostatniW( 0 ) { } void dodaj( iteratorX & iterL, char obj ); private: void dodaj_na_koniec( wezel * nowyW ); void dodaj_na_poczatek( wezel * nowyW ); void dodaj_na_srodek( wezel * nowyW, wezel * wybranyW ); }; void lista::dodaj( iteratorX & iterL, char obj ) { wezel * nowyW = new wezel; nowyW->dana = obj; if( iterL.wybranyW != 0 ) { if( iterL.wybranyW == pierwszyW ) { dodaj_na_poczatek( nowyW ); } else { dodaj_na_srodek( nowyW, iterL.wybranyW ); } } else { dodaj_na_koniec( nowyW ); } } void lista::dodaj_na_koniec( wezel * nowyW ) { if( pierwszyW == 0 ) { pierwszyW = nowyW; } else { ostatniW->wsk_next = nowyW; nowyW->wsk_poprz = ostatniW; } ostatniW = nowyW; } void lista::dodaj_na_poczatek( wezel * nowyW ) { pierwszyW->wsk_poprz = nowyW; nowyW->wsk_next = pierwszyW; pierwszyW = nowyW; } void lista::dodaj_na_srodek( wezel * nowyW, wezel * wybranyW ) { ( wybranyW->wsk_poprz )->wsk_next = nowyW; nowyW->wsk_poprz = wybranyW->wsk_poprz; wybranyW->wsk_poprz = nowyW; nowyW->wsk_next = wybranyW; }
#endif
#ifndef iteratorL_H #define iteratorL_H
#include <iostream> #include "lista.h"
class iteratorX { private: friend class lista; lista::wezel * wybranyW; lista & pojemnik; public: iteratorX( lista & poj ) : pojemnik( poj ) { wybranyW = pojemnik.pierwszyW; } };
#endif
Program wogule niedziala wyswietla sie komunikat :
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(14): error C2027: use of undefined type 'lista'
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(14): error C2143: syntax error : missing ';' before '*'
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(20): error C2065: 'wybranyW' : undeclared identifier
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(20): error C2027: use of undefined type 'lista'
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\iteratorl.h(20): error C2228: left of '.pierwszyW' must have class/struct/union
There is no context in which this conversion is possible
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\lista.h(41): error C2039: 'wybranyW' : is not a member of 'iteratorX'
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\lista.h(43): error C2039: 'wybranyW' : is not a member of 'iteratorX'
c:\documents and settings\fers\moje dokumenty\visual studio 2010\projects\sek\sek\lista.h(49): error C2039: 'wybranyW' : is not a member of 'iteratorX'
Prosze o pomoc :) ! |
|
Monika90 |
» 2013-03-27 21:58:46 Definicja klasy iteratorX zależy od definicji klasy lista, bo zawiera odwołanie do lista::wezel, w związku z tym definicja iteratorX musi w kodzie wystąpić po definicji klasy lista. |
|
fers334 Temat założony przez niniejszego użytkownika |
» 2013-03-27 22:08:28 Okey a w jaki sposób mam to rozwiązać poprostu przy tworzeniu nowego projektu najpierw dodać listę potem iterator listy , bo jak tak to nic to nie zmieniło możesz napisać co mam na to poradzić ? |
|
Monika90 |
» 2013-03-28 09:30:33 sugeruję umieścić definicje obu klas (lista i iteratorX) w jednym pliku nagłówkowym, a definicje ich funkcji składowych w pliku .cpp (który dodajesz do projektu) plik lista.h #ifndef LISTA_H #define LISTA_H
class iteratorX;
class lista { private: friend class iteratorX; };
class iteratorX { private: friend class lista; };
#endif
plik lista.cpp #include "lista.h"
void lista::dodaj( iteratorX & iterL, char obj ) { }
void lista::dodaj_na_koniec( wezel * nowyW ) { }
|
|
« 1 » |