Funkcja wirtualna zwracajaca skladowa klasy

0

Witam,
mam jako zadanie dodatkowe do napisania program Karabin posiadajacy klase nadrzedna Pocisk i 3 dziedzidzace po niej klasy bedace typami pociskow. Kazdy typ pocisku ma wlasne dmg oczywiscie. Napisalem klase magazynek a w niej funkcje ktora zapelnia danym typem pocisku caly magazynek. Kolejna funkcja ma za zadanie sumowanie obrazen dla calego magazynku i na koniec w klasie Karabin wywolac obie te funkcje aby wyswietlil nam sie odglos pocisku + suma zadanych obrazen.
Probowalem jak moglem i dostalem drobne wskazowki od wykladowcy ale stanalem wlasnie na tej jednej funkcji zwracajacej sume dmg.
Oto fragment kodu:

Tutaj klasa nadrzedna i jedna klasa podrzedna.

 class Pocisk{
    public:
        virtual float dmg()=0;
        virtual void animacja_strzalu()
        {
            cout<<"Pif - Paf !!!";
        }
    protected:
        virtual ~Pocisk(){};
};

class Odlamkowy: public Pocisk{
    protected:
        void animacja_strzalu()
        {
            cout<<"BooM !!!\n";
        }
        float dmg()
        {
            return 7.4;
        }
};

A to klasa magazynek

class Magazynek{
        Pocisk *ammo_dmg;
        Pocisk *amunicja[30];
        float suma=0;
        float obrazenia=0.0;
    public:
        void zapelnij_magazynek(int rodzaj_pocisku)
        {
            if (rodzaj_pocisku==1)
            {
                for(int i=0;i<30;i++)
                {
                    amunicja[i]=new Odlamkowy;
                }
            }
            if (rodzaj_pocisku==2)
            {
                for(int i=0;i<30;i++)
                {
                    amunicja[i]=new Zapalajacy;
                }
            }
            if (rodzaj_pocisku==3)
            {
                for(int i=0;i<30;i++)
                {
                    amunicja[i]=new Smugowy;
                }
            }
        }
        float suma_obrazen_pelnego_magazynka(int rodzaj_pocisku)
        {
            if (rodzaj_pocisku==1)
            {
                ammo_dmg=new Odlamkowy;
                obrazenia=(*ammo_dmg).dmg();
                suma=obrazenia*30;
                (*ammo_dmg).animacja_strzalu();
            }
            if (rodzaj_pocisku==2)
            {
                ammo_dmg=new Zapalajacy;
                obrazenia=(*ammo_dmg).dmg();
                suma=obrazenia*30;
                (*ammo_dmg).animacja_strzalu();
            }
            if (rodzaj_pocisku==3)
            {
                ammo_dmg=new Smugowy;
                obrazenia=(*ammo_dmg).dmg();
                suma=obrazenia*30;
                (*ammo_dmg).animacja_strzalu();
            }
            return suma;
        }
}; 

Funkcja sumujaca tak wyglada na chwile obecna, tak wiem jest bez sensu. Problem w tym ze po prostu nie mam zadnego pomyslu jak zsumowac w niej te obrazenia bez ponownego pisania ifow (z tego co wiem te ify maja byc robione tylko i wylacznie raz przy tworzeniu obiektow i jako funkcja virtualna).

Czy ktos moglby pomoc mi z ta funkcja? Bede naprawde wdzieczny.

0

Wykorzystaj polimorfizm... Wystarczy, że przeiterujesz po tablicy z amunicją i na każdym z tych obiektów wywołasz metodę dmg() i masz sumę obrażeń.

0

Szczerze mowiac niebardzo wiem jak sie do tego dobrac.
Zapomnialem w 1 poscie napisac, ze funkcja
float suma_obrazen_pelnego_magazynka()
{

    }

nie powinna przyjmowac zadnych argumentow.

0

Stwórz metodę, która zwraca Ci odpowiedni nowy pocisk w zależności od tego jaki chcesz. Wtedy będzie miał to w jednym miejscu.

1
 
float suma_obrazen_pelnego_magazynka() const
{
    float suma_obrazen = 0.0f; 
    for (int i = 0; i < 30; i++) 
    {
        if (NULL != amunicja[i]) 
        {
           suma_obrazen += amunicja[i]->dmg();
        } 
    }
    return suma_obrazen;            
}
0

Jeju rzeczywiscie prosty kod do tego, ze nie wpadlem na to.
Dzieki wielkie Satirev :)

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