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);
friend class Automat;
oraz inne użyjprotected