Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Tworzenie iteratora do własnego kontenera na dane

Ostatnio zmodyfikowano 2013-03-28 09:30
Autor Wiadomość
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
C/C++
#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 :) !
P-79496
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.
P-79503
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ć ?
P-79504
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
C/C++
#ifndef LISTA_H
#define LISTA_H

class iteratorX; //deklaracja zapowiadająca

class lista
{
private:
    friend class iteratorX;
   
    //itd...
   
};

class iteratorX
{
private:
   
    friend class lista;
   
    //itd...
};

#endif

plik lista.cpp
C/C++
#include "lista.h"

void lista::dodaj( iteratorX & iterL, char obj )
{
    //itd...
}

void lista::dodaj_na_koniec( wezel * nowyW )
{
    //itd
}

//i tak dalej dla pozostałych funkcji składowych...
P-79515
« 1 »
  Strona 1 z 1