Ahoj, píšu menší hru a narazila jsem na dva (nejspíš spolu související) problémy. Jeden se týká ukládání samotných postav do souboru a druhý práce s třídou Bag a Suit - batoh a oblečení postavy.
Vytvořila jsem třídu Player, která má 4 téměř identické podtřídy. Nadtřída Player mimo jiné obsahuje ukazatele na třídy Bag a Suit. Program funguje tak, že v jedné funkci vytvořím instanci Player, kterou vracím do základní funkce, která s Playerem dál pracuje -> načítání postav ze souboru. Při vytváření postavy se také vytvoří ukazatel na třídu Player a zavolá se metoda, která postavu vypíše do souboru. Problémem je, že se mi nepovedlo donutit batoh a oblečení, aby se vypsalo.
class Player{
protected:
//...
Bag * batoh;
Suit * oblek;
public:
Player(){
};
Player(char * jmeno, char p){
//...
batoh = new Bag;
oblek = new Suit;
Vec mec("Kyj zacatecnika", 1, 0, 1, 0, 1);
Vec boty("Platene botky", 0, 0, 1, 0, 2);
oblek->suitUp(mec);
oblek->suitUp(boty);
delete [] mec.jmeno;
delete [] boty.jmeno;
}
virtual ~Player(){
delete [] name;
delete [] povolani;
delete batoh;
delete oblek;
}
int printB(WINDOW * win, const Player & a){
return (a.batoh->print(win));
}
void printS(WINDOW * win, const Player & a){
(a.oblek->print(win));
}
virtual void writeIn(const Player & a, const char * kam) const = 0;
//...
};
Funkce zapisující postavy do souboru:
virtual void writeIn(const Player & b, const char * kam) const{
ofstream out ("./temp");
ifstream in (kam);
string radek;
char pom[21];
int i, j, cnt = 0;
PClovek * a = (PClovek*) & b; //podtrida Player
while(getline(in, radek)){
for(i = 0; i < radek.size(); i++){
if(radek[i] == '}') break;
pom[i] = radek[i];
}
if(strncmp(pom, a->name, i) != 0)
out << radek << endl;
else {out << a->name << "}" << a->pohlavi << "}" << a->rasa << "}"
<< a->povolani << "}" << a->level << "}" << a->hp << "}"
<< a->sila << "}" << a->obrat << "}" << a->intel << "}"
<< a->sarm << "}" << (a->batoh) << (a->oblek) << " " << endl;
cnt++;}
for(j = 0; j < i; j++) pom[j] = ' ';
}
if(cnt == 0) out << a->name << "}" << a->pohlavi << "}" << a->rasa << "}"
<< a->povolani << "}" << a->level << "}" << a->hp << "}"
<< a->sila << "}" << a->obrat << "}" << a->intel << "}"
<< a->sarm << "}" << (a->batoh) << (a->oblek) << " " << endl;
remove(kam);
rename("temp", kam);
}
Bag a Suit:
class Bag{
Vec * pole;
int size;
int pocet;
public:
Bag(){
size = 10;
pole = new Vec[size];
pocet = 0;
}
~Bag(){
for(int i = 0; i < pocet; i++) {
delete [] pole[i].jmeno;
}
delete [] pole;
}
friend ostream & operator<<(ostream & os, const Bag & bag){
int i, ok = 0;
for(i = 0; i < bag.pocet; i++){
if(ok == 1) os << ",";
if(strcmp(bag.pole[i].jmeno, "Kyj zacatecnika") == 0
|| strcmp(bag.pole[i].jmeno, "Platene botky") == 0)
continue;
os << bag.pole[i].jmeno << "}" << bag.pole[i].a << "}"
<< bag.pole[i].b << "}" << bag.pole[i].c << "}"
<< bag.pole[i].d << "}" << bag.pole[i].typ << "}";
ok = 1;
}
return os;
}
int print(WINDOW * win) const{
int i;
for(i = 0; i < pocet; i++){
//if(pole[i].jmeno != NULL)
mvwprintw(win, 3+i, 3, "%s (%d-%d-%d-%d-%d)", pole[i].jmeno,
pole[i].a, pole[i].b, pole[i].c,
pole[i].d, pole[i].typ);
}
return i;
}
//...
};
class Suit{
private:
Vec * pole;
int size;
int pocet;
public:
Suit(){
size = 5;
pole = new Vec[size];
pocet = 1;
}
~Suit(){
for(int i = 0; i < 5; i++) {
if(pole[i].jmeno != NULL)
delete [] pole[i].jmeno;
}
delete [] pole;
}
friend ostream & operator<<(ostream & os, const Suit & suit){
int i, ok = 0;
for(i = 0; i < suit.size; i++){
if(suit.pole[i].jmeno != NULL){
if(ok == 1) os << ",";
if(strcmp(suit.pole[i].jmeno, "Kyj zacatecnika") == 0
|| strcmp(suit.pole[i].jmeno, "Platene botky") == 0)
continue;
os << suit.pole[i].jmeno << "}" << suit.pole[i].a << "}"
<< suit.pole[i].b << "}" << suit.pole[i].c << "}"
<< suit.pole[i].d << "}" << suit.pole[i].typ << "}";
}}
return os;
}
void print(WINDOW * win) const{
int i;
for(i = 0; i < size; i++){
if(pole[i].jmeno != NULL)
mvwprintw(win, 16+i, 3, "%s (%d-%d-%d-%d-%d)",
pole[i].jmeno, pole[i].a, pole[i].b,
pole[i].c, pole[i].d, pole[i].typ);
}
}
//...
};
Vec je struktura obsahující přetíženy operátor =.
Nevím, jak docílit toho, aby se věci z batohu a oblečení správně vypsalo, zvládám jen vypsat adresu...
Druhý problém je v tom, že když hraji s jakoukoli postavou, pozměním něco v batohu, obleču si věci a tak, vše funguje, jak by mělo. "Ukončím" kolo - odejdu ze hry, ale ne z programu, vyberu si znovu jakoukoli postavu, stačí, abych jen otevřela batoh a program spadne. Zjistila jsem, že za to můžou metody Player::printS a printB, čili nějaká špatná práce s batohem/oblečením, možná špatné mazání, ale nevím, kde...
Díky za jakékoliv nápady...