Anonymní profil Tuqi – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Tuqi – Programujte.comAnonymní profil Tuqi – Programujte.com

 

Příspěvky odeslané z IP adresy 46.13.101.–

Tuqi
C / C++ › Hra - třídy, podtřídy, příst…
16. 5. 2014   #190255

Bude to asi hodně prasácký, tohle jsem zkoušela a padá to... :(

Vec:

struct Vec{
        char * jmeno;
        int a;
        int b;
        int c;
        int d;
        int typ;
        Vec(){
            
        }
        Vec(char * name, int i, int ii, int iii, int iiii, int t){
            int delka = strlen(name);
            jmeno = new char[delka+1];
            strcpy(jmeno, name);
            a = i;
            b = ii;
            c = iii;
            d = iiii;
            typ = t;
        };
        ~Vec(){
        }
        
        Vec & operator=(const Vec & predmet){
            int delka = strlen(predmet.jmeno); 
            jmeno = new char[delka + 1];
            strcpy(jmeno, predmet.jmeno);
            
            a = predmet.a;
            b = predmet.b;
            c = predmet.c;
            d = predmet.d;
            typ = predmet.typ;
            
            return *this;
        }
        
    };

suitUp() 

void Player::suitUp(int x){
        Vec pom = batoh->del(x);
        Vec pom2 = oblek->suitUp(pom);
        if(pom2.typ < 10){
            sila -= pom2.a;
            intel -= pom2.b;
            obrat -= pom2.c;
            sarm -= pom2.d;
            batoh->add(pom2);
        }
        sila += pom.a;
        intel += pom.b;
        obrat += pom.c;
        sarm += pom.d;
    }

Vec Bag::del(int i){
        // vyhodi vec z batohu, vraci ji navratovou hodnotou
        Vec pom = pole[i];
        //delete [] pole[i].jmeno;
        
        if(i != pocet-1){
            pole[i] = pole[pocet-1];
            //delete [] pole[pocet-1].jmeno;
        }
        
        pocet--;
        
        return pom;
    }



Vec Suit::suitUp(const Vec & oblek){
        // oblece vec, pokud je oblecena vec stejneho typu, 
        // oblece novou a starou return, jinak vrati tu samou
        //int i, j;
        Vec pom = oblek;
        
        if((pocet % oblek.typ == 0 && oblek.typ != 2 && oblek.typ != 1)
                || oblek.typ == 1 || oblek.typ == 2){
            Vec pom2 = pole[oblek.typ-1];
            //delete [] pole[oblek.typ-1].jmeno;
            pole[oblek.typ-1] = pom;
            return pom2;
        }
        
        pocet *= oblek.typ;
        
        pole[oblek.typ-1] = pom;
        pom.typ *= 10;
        return pom;
    }
Tuqi
C / C++ › Hra - třídy, podtřídy, příst…
16. 5. 2014   #190235

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...

Tuqi
C / C++ › Alokace tříd s virtual
8. 5. 2014   #189923

#4 voty
Jasně :D ... díky moc, už to vypadá lépe.

Tuqi
C / C++ › Alokace tříd s virtual
8. 5. 2014   #189918

#2 Martin Kozibrátka
Nepomohlo, ale díky, nevšimla jsem si toho...

Tuqi
C / C++ › Alokace tříd s virtual
8. 5. 2014   #189916

Ahoj, mám problém s alokací podtříd s virtual metodami. Vytvořila jsem základní třídu Player a k ní 4 podtřídy (jednou z nich je PClovek).  

class Player{
protected:
    int level;
    int hp;
    
    char * name;
    char * povolani;
    char pohlavi;
    
    int sila;
    int intel;
    int obrat;
    int sarm;
    
    Bag * batoh;
    Suit * oblek;
    
public:
    int actual;
    Player(){
        
    };
    Player(char * jmeno, char p){
        level = 1;
        hp = 50;
        actual = 50;
        
        int delka = strlen(jmeno); 
        name = new char[delka + 1];
        strcpy(name, jmeno);
        
        pohlavi = p;
        sila = 5;
        intel = 5;
        obrat = 5;
        sarm = 5;
        
        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);
    }
    Player(char * jmeno, char p, int lvl, int hp2, int s, int o, int i, 
           int sa){
        level = lvl;
        hp = hp2;
        actual = hp2;
        
        int delka = strlen(jmeno); 
        name = new char[delka + 1];
        strcpy(name, jmeno);
        
        pohlavi = p;
        sila = s;
        intel = i;
        obrat = o;
        sarm = sa;
        
        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);
    }
    Player(const Player & a){
        level = a.level;
        hp = a.hp;
        actual = a.actual;

        //int delka = strlen(a.name);
        strcpy(name, a.name);
        strcpy(povolani, a.povolani);
        pohlavi = a.pohlavi;

        sila = a.sila;
        intel = a.intel;
        obrat = a.obrat;
        sarm = a.sarm;

        batoh = (a.batoh);
        oblek = (a.oblek);
    }
    virtual ~Player(){
        delete [] name;
        delete [] povolani;
        delete batoh;
        delete oblek;
    }
     /*... několik běžných metod, bez virtual, které nepotřebuji v závislosti na podtřídě měnit */

    virtual string Type() const = 0;
    
    virtual void writeIn(const Player & a, char * kam) const = 0;
  
};

//-------------------------------------------------------------

class PClovek: public Player::Player{
private:
    char * rasa;
    
public:
    PClovek(char * jmeno, char p): Player(jmeno, p){
        rasa = new char[7];
        strcpy(rasa, "Clovek");
        
        sila = 5;
        intel = 5;
        obrat = 6;
        sarm = 4;
    }
    PClovek(char * jmeno, char p, int lvl, int hp2, int s, int o, int i, int sa): Player(jmeno, p, lvl, hp2, s, o, i, sa){
        rasa = new char[7];
        strcpy(rasa, "Clovek");
    }
    PClovek(const PClovek & a): Player(a){
        strcpy(rasa, a.rasa);
    }
    virtual ~PClovek(){
        delete [] rasa;
    }

    virtual string Type() const{
        return "Clovek";
    }
    
    virtual void writeIn(const PClovek & a, const char * kam) const{
        //implementace
    }
};
 
// + další 3 stejně vypadající podtřídy



int main(){
    Player * a = new PClovek(...);
}

Pokud chci -> Player * a = new PClovek(char *, char); <- napíše chybu "cannot allocate an object of abstract type because the following virtual functions are pure".  Kde je chyba?

Děkuji
 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý