Własny szablon klas

0

Witam
Mam problem z programem, który ma wektor(kopia vectora z stl), oraz 3 klasy: firma, sklep i produkty. Klasa firma posiada w sobie wektor sklepów, a klasa sklep posiada wektor produktów. Problem pojawia się gdy już do stworzonej pierwszej firmy i w niej pierwszego sklepu, próbuję dodać kolejny sklep. Program nie dodaje do tego wektora sklepu, jak by coś było nie tak z funkcją PushBack().
Wklejam kod wektora:

template<class T>
class Wektor{
private:
    T* item; 
    int maxSize;
    int actualSize;
    void allocNew();
public:
    Wektor();
    Wektor(int size);
    ~Wektor();
    Wektor(const Wektor& wektor);
    void PushBack(const T& itemToPush);
    void Insert(int iterator, const T& itemToPush);
    void Delete(int iterator);
    void Erase();
    int Size() const;
    T operator[](int i) const;

};

template<class T>
Wektor<T>::Wektor(){
    maxSize = 3;
    actualSize = 0;
    item = new T[maxSize];
}

template<class T>
Wektor<T>::Wektor(int size){
    maxSize = size;
    actualSize = 0;
    item = new T[maxSize];
}

template<class T>
Wektor<T>::~Wektor(){
    delete[] item;
}

template<class T>
Wektor<T>::Wektor(const Wektor& wektor){

}

template<class T>
void Wektor<T>::PushBack(const T& itemToPush){
    if (actualSize + 1 > maxSize)
        allocNew();
    item[actualSize] = itemToPush;
    actualSize++;
}

template<class T>
T Wektor<T>::operator[](int i) const{
    return item[i];
}

template<class T>
void Wektor<T>::allocNew(){
    maxSize = actualSize * 2;
    T* temp = new T[maxSize];
    for (int i = 0; i < actualSize; i++)
    {
        temp[i] = item[i];
    }
    delete[] item;
    item = temp;
}

template<class T>
int Wektor<T>::Size() const{
    return actualSize;
}

template<class T>
void Wektor<T>::Insert(int iterator, const T& itemToPush){
    if (actualSize + 1 > maxSize)
        allocNew();
    for (int i = (actualSize - 1); i >= (iterator - 1); i--)
    {
        item[i + 1] = item[i];
    }
    item[iterator - 1] = itemToPush;
    actualSize++;
}

template<class T>
void Wektor<T>::Delete(int iterator){
    for (int i = iterator; i < actualSize; i++)
    {
        item[i - 1] = item[i];
    }
    actualSize--;
}

template<class T>
void Wektor<T>::Erase(){
    delete[] item;
    item = new T[maxSize];
    actualSize = 0;
} 

Header klasy firma:

class Firma{
public:
    Wektor<Sklep> sklepy;
    Firma(){}
    Firma(string nFirmy, string uSklepu);
    Firma(const Firma& firma);
    void Wypisz();
    void DodajSklep(string ulica);
    string nazwaFirmy;
    Firma& operator=(const Firma& firma);

};

Kod z maina:

Wektor<Firma> wektor;
    string nazwaFirmy = "adidas";
    string ulicaSklepu = "warszawska";
    Firma firma(nazwaFirmy, ulicaSklepu);
    wektor.PushBack(firma);
    wektor[0].sklepy.PushBack(*new Sklep("poznanska"));
    wektor[0].Wypisz();

Program wypisuje tylko "adidas warszawska", natomiast "poznanska" już nie. Dodam jeszcze, że gdy użyłem vector z stl to działał program poprawnie. Próbowałem debugować program, dziwna sytuacja, gdy próbuję dodać poznanska, wywołuje się domyślny konstruktor wektora, co mnie całkowicie dziwi. Proszę o pomoc

4

Tutaj masz piękną KOPIĘ obiektu.

T operator[](int i) const;

Dodajesz coś do KOPII, kopia znika, znikają marzenia.

 wektor[0].sklepy.PushBack(*new Sklep("poznanska"));

Oszczędziłbyś sobie makaronizmu, co?

0

Nie rozumiem.

1

A co tu rozumieć - schrzaniłeś operator [].

0

Ok, teraz działa, dodanie dwóch znaczków "&" załatwiło sprawę. Dzięki za pomoc.

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