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

C++ dynamiczna tablica w klasie

Object Storage Arubacloud
0 głosów
837 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez karols32 Nowicjusz (120 p.)

Dobry wieczór, zadanie wygląda następująco:

1. tworzę klasę "towar" z trzema polami niepublicznymi(id towaru, cena towaru, ilość towaru) oraz jakieś metody.

2. tworzę klasę "sklep", z trzema polami niepublicznymi(nazwa sklepu, maksymalna ilość towarów w sklepie,aktualną ilość różnych towarów w sklepie, wskaźnik na pierwszy element tablicy towarów(typu towar)).

3. w konstruktorze klasy "sklep" mam utworzyć dynamiczną tablicę "artykuly".

4. w klasie "sklep" stworzyć metodę, która doda do listy artykułów towary(tylko nagłówki).

Mój kod:

#include <iostream>
using namespace std;



class Towar{

    const string ID;
    float cena;
    int stan;

public:
    Towar(string, float, int);
    void wyswietl() const;
    void zmienStan(float x);
    void zwiekszStan(float x);
    void zmniejszStan(float x);
    float zwrocCeneCalkowita() const;


};

class Sklep{
    string nazwa;
    int maks;
    int ile;
    Towar towar;
    Towar *artykuly;

public:
    Sklep(string,int,int,Towar);
    void wyswietl() const;
    void dodajTowar();

};

Sklep::Sklep(string nz, int mx, int il, Towar t):towar(t),nazwa(nz),maks(mx){
    ile=0;
    ile=il;
    if(ile>maks)
        ile=maks;

    Towar** artykuly = new Towar*[ile];
        for( int  i = 0; i < ile; i++ ){
            artykuly[i] = new Towar();
        }


    for( int i = 0; i < ile; ++i ){
    delete[] artykuly[i];
    }
        delete[] artykuly;

}

void Sklep::wyswietl() const{
    cout << "nazwa: " << nazwa << ", max: " << maks << ", ile: " << ile << endl;
}



Towar::Towar(string IDD, float cn=0, int st=0):ID(IDD) {
    cena=cn;
    stan=st;

    if(cena<0){
        cena=0;
    }

    if(stan<0){
        stan=0;
    }



}
float Towar::zwrocCeneCalkowita() const {
    float ile = cena*stan;

    if(ile>0){
    return cena*stan;

    } else
    return 0;
}


void Towar::zmniejszStan(float x) {

  if(stan==0){
    stan=0;
  }else if(x<0){

    stan-=0;
  } else
    stan-=x;

}

void Towar::zwiekszStan(float x) {
    if(x<0){
        stan+=0;
    }
    else stan+=x;
}

void Towar::zmienStan(float x) {
    if(x<0){
        stan=0;
    }
    else stan=x;

}

void Towar::wyswietl() const {

    cout<<ID<<endl;
    cout<<cena<<endl;
    cout<<stan<<endl;
    cout<<"Wartosc posiadanych towarow: "<<zwrocCeneCalkowita();
}




int main() {

    Towar t1("1A",5,10);
    t1.wyswietl();cout<<endl;
    cout << endl;
    Sklep s1("Warzywniak",10,8,t1);
    s1.wyswietl();
    return 0;
}

Problem polega na tym, że stoję w puncie trzecim i nie mam zielonego pojęcia jak utworzyć tablicę dynamiczną mając wskaźnik na pierwszy element typu "towar".

Towar** artykuly = new Towar*[ile];
        for( int  i = 0; i < ile; i++ ){
            artykuly[i] = new Towar();
        }


    for( int i = 0; i < ile; ++i ){
    delete[] artykuly[i];
    }
        delete[] artykuly;

Prosiłbym o jakąkolwiek pomoc, widocznie nie rozumiem też tego zadania, może ktoś mógłby mi wyjaśnić jak mam się za to zabrać.

komentarz 27 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
Mógłbyś podesłać pełną treść?
komentarz 27 stycznia 2021 przez karols32 Nowicjusz (120 p.)
niestety nie mogę, coś jest niejasne?
komentarz 27 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
Wygląda trochę jak XY, bo nie wiem po co Ci pointer na pointer
komentarz 27 stycznia 2021 przez karols32 Nowicjusz (120 p.)
W zadaniu jest napisane żeby zadeklarować ten wskaźnik na pierwszy element i stworzyć tablicę dynamiczną, poradziłem sobie z tym dzięki koledze niżej, teraz muszę stworzyć listę artykułów z czego podam w niej tylko nagłówki produktów, masz może jakiś pomysł?

1 odpowiedź

0 głosów
odpowiedź 27 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Tablice dynamiczną tworzysz w konstruktorze klasy Sklep

Towar* artykuly = new Towar[ile];

Pamiętaj aby dodać w destruktorze tej samej klasy

delete []artykuly;

Dodatkowo aby cały kod się skompilował potrzebny jest domyślny konstruktor w klasie Towar.

Towar() = default;

 

komentarz 28 stycznia 2021 przez j23 Mędrzec (194,920 p.)
Jakie nagłówki towarów? Rozwiń.
komentarz 28 stycznia 2021 przez karols32 Nowicjusz (120 p.)
edycja 28 stycznia 2021 przez karols32

Po prostu metoda, która ma dodać do listy artykułów(tutaj pewnie ma na myśli nowo utworzoną tablicę dynamiczną) towar(tylko nagłówek), ale nie wiem co autor miał na myśli, czy chodzi o to żeby do "sklepu" dodać "towar"?

Wydaje mi się, że chodzi o ten identyfikator, pole niepubliczne(ID) z Towaru, które ma zostać dodane do tablicy dynamicznej utworzonej w Sklepie. Dajmy na to tworzymy:

Towar t1("ID1",5,10);// 5-cena towaru, 10-liczba danego towaru
Sklep s1("Warzywniak",8,5); // 8-maksymalna ilość towarów w sklepie, 5-ilośc aktualnych towarów w sklepie
//poprzez metodę "dodajTowar" dodajemy do nowo utworzonej tablicy dynamicznej  "ID1" z obiektu t1 
//np.
s1.dodajTowar(t1);

Na pozycje w indeksie tablicy[0], a następnie kolejny nagłówek możliwe, że z t2("ID2") znowu do s1 na pozycje [1], aż skończy się rozmiar tablicy czyli ILE.

Ja tak to rozumiem, ale nie wiem jak to zrobić i czy da się tak to zrobić.

komentarz 28 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Spróbuj zaimplementować funkcję Sklep::dodajTowar w poniższy sposób:

void Sklep::dodajTowar( const Towar& towar ){     
     if( warunek ) 
     { 
        artykuly[indeks] = towar;
        ++indeks;  
     }     
}

Gdzie zmienna indeks (najlepiej dodać ją do ciała klasy Sklep i ustawić na zero) będzie pokazywała zajętość sklepu (nie może być większa od maks).  Stąd też musisz dodać warunek sprawdzający czy liczba nowych artykułów ( z uwzględnieniem parametru stan ) nie przekracza pojemności sklepu, w przeciwnym razie artykuł nie może zostać dodany.

 

komentarz 28 stycznia 2021 przez karols32 Nowicjusz (120 p.)

Okej, zadeklarowałem tę metodę, program się kompiluje, musiałem dodać w klasie Towar:

Towar & operator=(Towar const&) {}; 

poza tym nie wiem jak odwołać się w metodzie:

void Sklep::dodajTowar(const Towar& towar){
     while(indeks<maks){
        if(indeks<ile)
        {
            artykuly[indeks] = towar;
            indeks++;
        }
     }
}

do:

int stan;

ponieważ jest to pole prywatne.

Poza tym ostatnim elementem tego zadania jest wyświetlenie tejże "listy artykułów", szczerze mówiąc, nie sądziłem, że dotrę tak daleko, więc o tym nie pisałem laugh

Zastanawiałem się żeby przeciążyć operator "<<" i może jakoś wtedy to wyświetlić?

komentarz 28 stycznia 2021 przez j23 Mędrzec (194,920 p.)

musiałem dodać w klasie Towar: (...)

Po co? Domyślny operator będzie działać. A jak już robisz ten operator, to powinieneś go zaimplementować zgodnie z przeznaczeniem.

(...) ponieważ jest to pole prywatne.

Zrób odpowiedni akcesor/mutator (w sumie to chyba już jest) dla tego pola.

Podobne pytania

0 głosów
2 odpowiedzi 1,983 wizyt
pytanie zadane 24 lutego 2018 w C i C++ przez Programeł Gaduła (3,500 p.)
0 głosów
1 odpowiedź 189 wizyt
0 głosów
1 odpowiedź 729 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...