kompozycja c++

0

Witam,

mam problem z kompozycja a mianowicie ja w zamieszczonym kodzie kategorie dodaja sie bez problemow ale przy probie dodania produktu wystepuja jakies problemy (niby pisze ze produkt zostal pomyslnie dodany ale jak chcĘ wyswietlic jego nazwe to juz sa jakies bledy)

#include <iostream>
#include <string.h>
using namespace std;

class Produkty {
        char produkt[30];
        int rozmiar;
        public:
                Produkty(int rozmiar, char *produktw){
                    this -> rozmiar = rozmiar;
                    strcpy(produkt, produktw);
                    cout << "Dodano pomyslnie produkt o nazwie: " << produkt << endl;
                }

                string nazwa(){
                return produkt;
                }
};

class Kategorie {
        Produkty **produkt;
        char kategoria[30];
        int rozmiar;
        public:
                Kategorie(int rozmiar, char *kategoriaw){
                    produkt=new Produkty* [rozmiar];
                    for(int i=0; i<rozmiar; i++) {
                        produkt[i]=NULL;
                    }
                    this -> rozmiar = rozmiar;
                    strcpy(kategoria,kategoriaw);
                    cout << "Dodano pomyslnie kategorie o nazwie: " << kategoria << endl;

                }

                string nazwa(){
                    return kategoria;
                }

                string nazwaprodukt(){
                    cout << produkt[0]->nazwa();
                }

                int dodaj_produkt(Produkty *j){
                for(int i=0; i<rozmiar; i++){
                    if(produkt[i]==j)
                        return 1;
                    if(produkt[i]==NULL){
                        produkt[i]=j;
                    }
                }
                }
};

class Sklep {
    Kategorie **kategoria;
    //Zamowienia **zamowienie;
    int rozmiar;

    public:
            Sklep(int rozmiar){
               kategoria=new Kategorie* [rozmiar];
                for(int i=0; i<rozmiar; i++) {
                        kategoria[i]=NULL;
                }
                this -> rozmiar = rozmiar;
            }

            int dodaj_kategorie(Kategorie *j){
                for(int i=0; i<rozmiar; i++){
                    if(kategoria[i]==j)
                        return 1;
                    if(kategoria[i]==NULL){
                        kategoria[i]=j;
                    }
                }
            }

            void dodaj_produkt(Produkty *j){
                        kategoria[0]->nazwaprodukt();
                        kategoria[0]->dodaj_produkt(j);
            }

};


int main()
{
    Sklep dzialy(30);
    Kategorie *a;
    Produkty *p;

    a = new Kategorie (20, "Samochody osobowe");
    dzialy.dodaj_kategorie(a);

    p = new Produkty (1, "Ford Focus");
    dzialy.dodaj_produkt(p);
    return 0;
}
0
pablo123 napisał(a)
class Produkty {
        char produkt[30];
...
        public:
                string nazwa() //!!!!!!

o ile wiem typ string to nie jest to samo co typ char*...
według http://kursy.ddt.pl/?LessonId=18 typ string to klasa a typ char* to wskaźnik więc przypisanie string=char* jest conajmniej dziwne...

0

Nic w tym dziwnego nie ma, nastąpi niejawna konwersja char[] -> string. Zajrzyj do dokumentacji i zobacz jakie string ma konstruktory. Jest natomiast pytanie, dlaczego autor miesza tablice char z std::stringiem, zamiast zdecydować się na jedno rozwiązanie (ze wskazaniem na stringa).

0
                int dodaj_produkt(Produkty *j){
                for(int i=0; i<rozmiar; i++){
                    if(produkt[i]==j)
                        return 1;
                    if(produkt[i]==NULL){
                        produkt[i]=j;
                    }
                }
                }
  1. jak juz wystepuje, returns 1, a co zwraca jak nie wystepowalo i produkt zostal faktycznie dopisany? a co zwraca jak nie udalo sie dodac z jakiegos powodu?
  2. porownywanie wskaznikow to zwykle kiepski pomysl, jesli zrobisz dwa razy New Produkt(costam, "Mama") i zapamietasz je w zmiennych X i Y, to X == Y zwroci FALSE, nawet mimo ze 'costam' i 'mama' sa rowne. linijka produkt[i]==j dziala wiec, ale sprawdza czy konkretny obiekt jest tym samym konkretnym obiektem, a nie sprawdza czy PRODUKT taki juz jest dodany. jesli to bylo Twoje zamierzenie -- to ok
  3. krecisz petla, robi sie return jesli juz znajdziesz ze wczesniej dodano taki wpis. jezeli znajdziesz ze nie ma go, i to-poletko-tablicy akurat jest NULL to wpisujesz w nie ów nowy element. I co dalej? dalej krecisz petla. Znowu znajdujesz puste miejsce i znowu wpisujesz tam element. I co dalej? dalej krecisz petla... w ten sposob, po PIERWSZYM WPISANIU, wszystkie dalsze puste kratki sa zapisywane niepotrzebnym smieciem, i nastepne wpisywanie nie UDAJE sie, gdyz.... NIE MA juz wolnych kratek w tablicy. patrz punkt 1)

ps. ten sam zonk masz w kategoriach

1 użytkowników online, w tym zalogowanych: 0, gości: 1