• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dwukierunkowa cykliczna obiektowo - metody klasy lista

Object Storage Arubacloud
0 głosów
811 wizyt
pytanie zadane 3 grudnia 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

Piszę program obsługujący listę dwukierunkową cykliczną i mam pewien problem. Mam klasę Lista i klasę Element, Lista jest przyjacielem Element, abym mógł za pomocą metod Lista dodawać elementy i operować ich atrybutami. Problem polega na tym, że w każdej metodzie Lista przy kompilacji otrzymuję błąd "lista was not declared in this scope". lista jest oczywiście obiektem klasy Lista. Pierwszą metodą jest dodanie jednego elementu i obsługuje ona przypadek gdy nie ma jeszcze elementów (utwórz listę i dopiero element) oraz gdy już są elementy (utwórz tylko element) - to działa.. Jednak inne metody (np. policz elementy, dodaj x nowych, usuń element) w domyśle są wywoływane tylko gdy obiekt lista istnieje, a nawet po dodaniu obsługi przypadku gdy lista nie istnieje, nadal otrzymuję błąd "not declared". Co mogę w tej sytuacji zrobić? Dodać w deklaracji klasy Lista static wystarczy? Nie będzie nieprzewidzianych efektów ubocznych?

#include <iostream>
#include <windows.h>

using namespace std;

int * tab;
int licznik = 0;
int wylosowanych = 0;

class element{
    friend class Lista;
    protected:
    int klucz;
    double d;
    char c;
    element * nastepny;
    element * poprzedni;

};

class Lista {
    static element * pierwszy;
    static element * ostatni;

    Lista();
    ~Lista();

    void wstaw_nowy(){
    int liczba;
   wczytanie:
    cout<<"Podaj wartosc klucza nowego elementu: ";
    cin>>liczba;
    if (tab){
        for (int i = 0; i<=wylosowanych; i++){
            if (liczba == tab[i]){
                cout<<"Element o takim kluczu ju¿ istnieje!"<<endl;
                system("pause");
                goto wczytanie;
            }
            else break;
        }
    }

    tab[wylosowanych]=(int)malloc(sizeof(int));
    tab[wylosowanych]=liczba;
    wylosowanych++;
    Lista lista;
   if (licznik == 0){ //licznik przechowuje iloœæ elementów listy

        element * elem = new element;
        elem->klucz = liczba;
        elem->c = (char)84;
        elem->d = rand()%10000-1000;
        elem->nastepny = elem;
        elem->poprzedni = elem;
        lista.pierwszy = elem;
        lista.ostatni = elem;
        licznik++;
   }
   else{
        element * wsk;
        wsk = lista.pierwszy;
        for (int i = 0; i<=licznik; i++){
            if((wsk->klucz < liczba)&&((wsk->nastepny->klucz) > liczba)){
                element * elem = new element;
                elem->klucz = liczba;
                elem->c = (char)84;
                elem->d = rand()%10000-1000;
                elem->nastepny = wsk->nastepny;
                elem->poprzedni = wsk;
                wsk->nastepny = elem;
                wsk->nastepny->poprzedni = elem;
                licznik++;
                break;
            }
            wsk = wsk->nastepny;
        }
   }
};

/*    void wstaw_x_nowych(ile){
        for (int i = 0; i<=ile; i++){
            wstaw nowy();
        }
    };*/
    void wyszukaj();

    void usun(int wart){
        element * szukany = lista.pierwszy;
        for (int i = 0; i<=licznik; i++){
            if (szukany->klucz == wart){
                szukany->poprzedni->nastepny = szukany->nastepny;
                szukany->nastepny->poprzedni = szukany->poprzedni;
                delete szukany;
            }
        }

    };

    void pokaz_pierwsze(int Y){
        element *wsk = lista.pierwszy;
        for (int i=0; i<=Y;i++){
            cout<<wsk->klucz<<endl;
            wsk=wsk->nastepny;
        }
    };

    void pokaz_ostatnie(int X){
        element * wsk = lista.pierwszy;
        for (int i=0; i<=Y;i++){
            cout<<wsk->klucz<<endl;
            wsk=wsk->poprzedni;
    };

    void ile_wezlow(){
        int wezly = 0
        element * wsk = lista.pierwszy;
        while (wsk->nastepny != lista.ostatni){
            wezly++;
            wsk = wsk->nastepny;
        }
    return wezly;
    };


    void usun_wszystko(){
        element * wsk = lista.pierwszy;
            for (int i =0; i<=ile_wezlow(); i++){
                delete element;
            }
            delete lista;
    };
};



int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

 

komentarz 5 grudnia 2018 przez j23 Mędrzec (194,920 p.)

Obiektowość tej listy jakaś kulawa jest -> zmienne globalne, statyczne pola no i rodzynek na cieście - goto. Spróbuj zrobić kilka instancji swojej listy z różnymi wartościami.

1 odpowiedź

0 głosów
odpowiedź 3 grudnia 2018 przez RafalS VIP (122,820 p.)

Skorzystaj z deklaracji wyprzedzającej:

class B; //deklaracja wyprzedzajaca
//mowi jedynie ze identyfikator B to jakas klasa

class A{
  friend class B;
};

class B{

};

 

Podobne pytania

0 głosów
1 odpowiedź 336 wizyt
0 głosów
1 odpowiedź 267 wizyt
0 głosów
1 odpowiedź 1,574 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...