Dziedziczenie i przeładowaniem metody w tabeli obiektów

0

Witam!
Mam problem z dziedziczeniem - mianowicie jeśli zadeklaruję sobie tablicę obiektów (patrz na samym dole) typu Weapon, po którym dziedziczy BronPalna i mam w obu klasach funkcję Wyjscie, która dodaje do pliku svg (za pomocą klasy Plik) znaczniki obrazu wektorowego. Powinny być one inne zależnie od klasy (gdyż w Weapon jest to nóż, a w BronPalna pistolet) jednak przez to, że jest to tabela typu Weapon to do pliku svg dodaje mi same noże z atrybutami, które przypisałem broni palnej (w tym wypadku zmienia się tylko kolor). Da się to jakoś obejść bez jakiejś dodatkowej tablicy, w której byłoby zapisane który element to nóż, a który to pistolet?
Z góry dzięki.

P.S. Jeśli ktoś z PW to przegląda i robi ten projekt na PROE to zmieniajcie kod, żeby nie było widać, że kopiowany ;)

 class Weapon{
    int obrazenia;
    int hp; //każde użycie broni powoduje jej zużywanie
    int waga;
    string nazwa;
    string kolor;

    friend class BronPalna;
    friend class Automat;
    friend class Karabin;
    friend class Czolg;
public:
    void atak(Weapon *ofiara){
        ofiara->hp-=this->obrazenia;
        this->hp-=1;
        ofiara->WypiszStaty();
        this->WypiszStaty();
    }
    Weapon(string xyz="bez_nazwy",string kol="white", int a=0, int b=0, int c=0){
        nazwa=xyz;
        obrazenia=b;
        hp=a;
        waga=c;
        kolor=kol;
        cout<<"Bron "<<nazwa<<" dodana do arsenalu!"<<endl;
    }
    ~Weapon(){
        cout<<"Bron "<<nazwa<<" zniszczona!"<<endl;
    }
    int HP(){
        return hp;
    }
    string NAZWA(){
        return nazwa;
    }
    int OBRAZENIA(){
        return obrazenia;
    }
    int WAGA(){
        return waga;
    }
    void WypiszStaty(){
        cout<<endl<<"Bron "<<nazwa<<":"<<endl<<"HP: "<<hp<<endl<<endl;
    }
    string Wyjscie(int x, int y, int nr){
        string ww="<path d=\"M "+to_string(x*270+110)+","+to_string(y*110+40)+" A 100 10 0 1 0 "+to_string(x*270+110)+","+to_string(y*110+60)+"\" stroke=\"darkgray\" stroke-width=\"1\" fill=\"silver\"/>\n";
        ww+="<path d=\"M "+to_string(x*270+210)+","+to_string(y*110+40)+" A 5 15 0 1 1 "+to_string(x*270+210)+","+to_string(y*110+60)+"\" stroke=\""+kolor+"\" stroke-width=\"1\" fill=\""+kolor+"\"/>\n";
        ww+="<rect x=\""+to_string(x*270+110)+"\" y=\""+to_string(y*110+40)+"\" width=\"100\" height=\"20\" stroke=\""+kolor+"\" stroke-width=\"1\" fill=\""+kolor+"\"/>\n";
        ww+="<line x1=\""+to_string(x*270+110)+"\" y1=\""+to_string(y*110+30)+"\" x2=\""+to_string(x*270+110)+"\" y2=\""+to_string(y*110+70)+"\" stroke=\"black\" stroke-width=\"5\" stroke-linecap=\"round\"/>\n";
        return ww;
    }
};

class BronPalna : public Weapon{
    int amunicja;

    friend class Automat;
    friend class Karabin;
    friend class Czolg;
public:
    BronPalna(string xyz="bez_nazwy",string kol="white", int a=0, int b=0, int c=0, int d=0){
        nazwa=xyz;
        obrazenia=b;
        hp=a;
        waga=c;
        amunicja=d;
        kolor=kol;
        cout<<"Bron "<<nazwa<<" dodana do arsenalu!"<<endl;
    }
    void atak(Weapon *ofiara){
        ofiara->hp-=this->obrazenia;
        this->hp-=1;
        this->amunicja-=1;
        ofiara->WypiszStaty();
        this->WypiszStaty();
    }
    void WypiszStaty(){
        cout<<endl<<"Bron "<<nazwa<<":"<<endl<<"HP: "<<hp<<endl<<"Amunicja: "<<amunicja<<endl<<endl;
    }
    string Wyjscie(int x, int y, int nr){
        string ww="<rect x=\""+to_string(x*270+10)+"\" y=\""+to_string(y*110+20)+"\" width=\"160\" height=\"20\" fill=\"dimgray\"/>\n";
        ww+="<rect x=\""+to_string(x*270+130)+"\" y=\""+to_string(y*110+40)+"\" width=\"40\" height=\"60\" fill=\""+kolor+"\"/>\n";
        ww+="<clipPath id=\"odciac_kawalek_kola"+to_string(nr)+"\">\n<rect x=\""+to_string(x*270+108)+"\" y=\""+to_string(y*110+38)+"\" width=\"22\" height=\"24\"/>\n</clipPath>\n";
        ww+="<circle cx=\""+to_string(x*270+130)+"\" cy=\""+to_string(y*110+40)+"\" r=\"20\" stroke=\"dimgray\" stroke-width=\"4\" fill=\"none\" clip-path=\"url(#odciac_kawalek_kola"+to_string(nr)+")\"/>\n";
        return ww;
    }
};

class Plik{
    fstream plik;
public:
    Plik(string nazwa, int ilosc){
        ilosc=ceil(sqrt(ilosc));
        nazwa+=".svg";
        plik.open(nazwa.c_str(), ios::out);
        plik<<"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\""<<ilosc*270<<"\" height=\""<<ilosc*110<<"\" version=\"1.1\">"<<endl;
    }
    ~Plik(){
        plik<<"</svg>";
        plik.close();
    }
    void DoPliku(Weapon *Bron[], int Ilosc){
        int rzad=ceil(sqrt(Ilosc));
        for(int i=0, k=0; i<rzad; i++)
            for(int j=0; j<rzad; j++, k++)
                if(k<Ilosc) plik<<Bron[k]->Wyjscie(i,j, k)<<endl;
    }
};

a potem mam w main():

int ilosc=3;
    Weapon *bron[10];
    bron[0]= new Weapon("Noz1", "green", 100, 10, 1);
    bron[1]= new Weapon("Noz2", "red", 50, 50, 50);
    bron[2]= new BronPalna("Pistolet1", "orange", 20, 100, 50, 10);

    string nazwa_pliku;
    cin>>nazwa_pliku;
    Plik nowy(nazwa_pliku, ilosc);
    nowy.DoPliku(bron, ilosc); 
0

Poczytaj nt. metod wirtualnych.

0

Poczytaj również o protected

0

Nie wiem o co chodziło z tym protected, ale wirtualna funkcja pomogła, dzięki ;)
P.S. Oznacza się tutaj jakoś temat do zamknięcia?

0

A co zmieni przejście z friend na protected, _13th_Dragon? Jak będę dziedziczył (znaczy nie ja, tylko klasa ;) ) to przeskoczy to na private w klasie "dziecku", ale jak mam zaprzyjaźnioną to chyba dziedziczy tak, jak było w klasie bazowej (private->private, public->public). Nie?

0

No spoko, poczytam sobie. Tymczasem dzięki :)

0

A wie ktoś może co mam zepsute w tych tablicach dynamicznych? Bo tworzę obiekt w tablicy, potem chcę dodać kolejny obiekt do tablicy, więc kopiuje elementy z tablicy do jakiejś nowej, tymczasowej usuwam starą i tworzę nową większą, a potem kopiuję z tymczasowej do nowej, ale działa mi to tylko dla trzech obiektów, jak jest więcej to się wykrzacza.

 class Arsenal{
    static int ilosc;
    Weapon **bron;
public:
    void DodajDoArsenalu(int wyb=0, string xyz="bez_nazwy", string kol="white", int a=0, int b=0, int c=0, int d=0, int e=0, int f=0, int g=0){
        ilosc++;
        if(ilosc==1) bron = new Weapon *[1];                 //chodzi mi konkretnie o ten fragment
        else{
            Weapon **temp = new Weapon *[ilosc];
            for(int i=0; i<ilosc-1; i++) temp[i]=bron[i];
            delete [] bron;
            Weapon **bron = new Weapon *[ilosc];
            for(int i=0; i<ilosc-1; i++) bron[i]=temp[i];
            delete [] temp;                                           //koniec
        }
        cout<<"Wyb: "<<wyb<<endl;
        switch(wyb){
            case 1: bron[ilosc-1]=new Weapon(xyz, kol, a, b, c); break;
            case 2: bron[ilosc-1]=new BronPalna(xyz, kol, a, b, c, d); break;
            case 3: bron[ilosc-1]=new Automat(xyz, kol, a, b, c, d, e); break;
            case 4: bron[ilosc-1]=new Karabin(xyz, kol, a, b, c, d, f); break;
            case 5: bron[ilosc-1]=new Czolg(xyz, kol, a, b, c, d, e, f, g); break;
        }
    }
    void Zapisz(){
        string nazwa_pliku;
        cout<<"Podaj nazwe pliku:"<<endl;
        cin>>nazwa_pliku;
        Plik nowy(nazwa_pliku, ilosc);
        nowy.DoPliku(bron, ilosc);
    }
};

int Arsenal::ilosc=0;

Jak próbuję tak to normalnie działa:

Weapon **bron = new Weapon *[5];
    bron[0]=new Weapon("q", "red", 1, 1, 1);
    bron[1]=new BronPalna("w", "red", 1, 1, 1, 1);
    bron[2]=new Automat("e", "red", 1, 1, 1, 1, 1);
    bron[3]=new Karabin("r", "red", 1,1, 1, 1, 1);
    bron[4]=new Czolg("t", "red", 1, 1, 1, 1, 1,1, 1);
0
    unsigned  ilosc; //  NIE STATIC
    Weapon **bron;
void DodajDoArsenalu(Weapon *nowa)
  {
   Weapon **tmp=new Weapon*[ilosc+1];
   memcpy(tmp,bron,ilosc*sizeof(Weapon*));
   delete[] bron;
   bron=tmp;
   tmp[ilosc++]=nowa;
  }
0

Nie do końca załapałem jak to działa, ale i tak mnie naprowadziłeś na rozwiązanie, działczy. DZIĘKI! :)

0

Działą to tak:

Arsenal A;
A.DodajDoArsenalu(new BronPalna("w","red",1,1,1,1));
A.DodajDoArsenalu(new Czolg("t","red",1,1,1,1,1,1,1));
0

84md7.jpg

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