Konstruktor kopiujacy wyciek pamieci

0

Witam,
mam problem z konstruktorem kopiujacym. Nie moge sobie poradzic z wyciekami pamieci, konstruktor kopiuje lecz podawaja wynik wiadomo.

class Magazynek{
        Pocisk *amunicja[30];
        // zmienne //
    public:
        //konstruktory, destruktory, metody//
        Magazynek(Magazynek &wzor_magazynek) // Konstruktor kopiujacy
        {
            for (int i=0;i<30;i++)
            {
                *amunicja[i]=*(wzor_magazynek.amunicja[i]);
            }
        }
};

class Karabin{
        Magazynek *nowy_magazynek=new Magazynek;
        //zmienne//
    public:
        //konstruktory, destruktory, metody//
        Karabin(Karabin &wzor_karabin) // Konstruktor kopiuajacy
        {
            nowy_magazynek=new Magazynek;
            *nowy_magazynek=*(wzor_karabin.nowy_magazynek);
        }
};

Probowalem wewnatrz konstruktorow kopiuajacych usunac wskazniki za pomoca delete ale w niczym to mi nie pomaga.
Bede wdzieczny za pomoc.

2

Karabin zrób na wzór tego

        Magazynek(const Magazynek& wzor_magazynek) // Konstruktor kopiujacy
        {
            for (int i=0;i<30;i++)
            {
                // zakladajac ze Pocisk ma konstruktor kopiujacy
                amunicja[i] = new Pocisk(*wzor_magazynek.amunicja[i]);
            }
        }

tak swoją drogą to lepiej użyj vector<Pocisk> i staraj się w ogóle nie używać pointerów jeśli nie trzeba wtedy nie trzeba w ogóle się babrać w konstruktory kopiujące bo samo będzie działać

0

Jasne, tylko ze zadanie moje polega wlasnie na napisaniu konstruktora dlatego sie z tym mecze niestety.

amunicja[i] = new Pocisk(*wzor_magazynek.amunicja[i]);

Niestety tu jest problem, gdyz klasa Pocisk jest jako abstrakcyjna i nie mozna utworzyc jej obiektu tylko po niej dziedziczonych np "Odlamkowy".

0

To zaimplementuj metodę abstrakcyjną Clone() w każdym type pochodnym...

0

I tu jest problem z abstrakcja klasy Pocisk.

 
class Pocisk{
      public:
            virtual Pocisk * clone()=0;
}

class Pochodna1 : public Pocisk{
      public:
            virtual Pocisk * clone()
            {
                  return new Pochodna1(*this);
            }
}

Nadal ten sam komunikat niestety nie moge sobie z tym poradzic. A nie mozna np. usunac (delete) odpowiednich wskaznikow!=NULL (w destruktorze ~Magazynek usuwam wylacznie amunicje[i]!=NULL bo pozostale wg kosntruktora sa NULL jesli wybralem 27 na 30 mozliwych pociskow to 3 brakujace = NULL) i w to samo miejsce wpisac wartosc z wzor.amunicja[i] ?

0

Po co na sile wprowadzasz cyrk, ktorego sam nie ogarniasz?
Zrob po prostu tak:

#include <vector>
using namespace std;

class Bullet {};

class Magazine {
  size_t capacity;
  vector<Bullet> bullets;
};

class Weapon {
  Magazine magazine;
};

int main()
{
  Weapon weapon;
}
0

Dlatego przeciez sie pytam skoro nie ogarniam... Niestety nie mam pomyslu na ten konstruktor kopiujacy gdyby ktos byl w stanie pomoc bede wdzieczny.

1

Jaki komunikat Ci się wyświetla? o_O

class Pocisk{
    public:
    virtual Pocisk* clone() = 0;
    virtual ~Pocisk() {}
};
     
class Pochodna1 : public Pocisk {
    public:
    virtual Pocisk* clone()
    {
      return new Pochodna1(*this);
    }
};
     
int main() {
    Pocisk* p1 = new Pochodna1();
    Pocisk* p2 = p1->clone();
    delete p1;
    delete p2;
    return 0;
}

http://ideone.com/9XhUBl
normalnie się kompiluje... wklej może kod czy coś

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