Alokace tříd s virtual – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Alokace tříd s virtual – C / C++ – Fórum – Programujte.comAlokace tříd s virtual – C / C++ – Fórum – Programujte.com

 

Tuqi
~ Anonymní uživatel
12 příspěvků
8. 5. 2014   #1
-
0
-

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
 

Nahlásit jako SPAM
IP: 46.13.101.–
Martin Kozibrátka0
Stálý člen
8. 5. 2014   #2
-
0
-

Zkus v té základní tříde

virtual void writeIn(const Player & a, char * kam) const = 0

přepsat na 

virtual void writeIn(const Player & a,const char * kam) const = 0

Nahlásit jako SPAM
IP: 176.102.79.–
Savana.cz - neomezený webhosting za pár kaček :)
Tuqi
~ Anonymní uživatel
12 příspěvků
8. 5. 2014   #3
-
0
-

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

Nahlásit jako SPAM
IP: 46.13.101.–
voty+1
Návštěvník
8. 5. 2014   #4
-
0
-

#3 Tuqi
Ještě je tam chyba, kdy u potomka je u writeIn(const PClovek& a, ...), kdežto u předka je writeIn(const Player& a, ...). Signatura metody musí být stejná, jinak nejde o přepis metody, ale novou metodu s jinými parametry.

Nahlásit jako SPAM
IP: 88.100.230.–
Jednu rozbil a tu druhou ztratil.
Tuqi
~ Anonymní uživatel
12 příspěvků
8. 5. 2014   #5
-
0
-

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

Nahlásit jako SPAM
IP: 46.13.101.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Virtual PC — založil Decide

Virtual device — založil franta22

Ms Virtual PC 2007 — založil laco797

Virtual metoda a soubor .h — založil Jana24

Moderátoři diskuze

 

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