Kompozice – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Kompozice – C / C++ – Fórum – Programujte.comKompozice – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tomas
~ Anonymní uživatel
510 příspěvků
2. 11. 2014   #1
-
0
-

   

#include <iostream>

using namespace std;

class Mec{
int m_sila;

public:
    Mec(int sila ){
      m_sila=sila;
    }

    int getSila(){
        return m_sila;
    }



};
class Brneni{
    int m_obrana;
public:
    Brneni(int silaBrneni){
        m_obrana=silaBrneni;
    }

    int getObrana(){
        return m_obrana;
    }

};

class Hrdina{
    Mec* m_mec;
    int m_sila;
    int m_obrana;
    Brneni*m_brneni;

public:
    Hrdina (int sila, int obrana, int silaBrneni){
        m_sila=sila;
        m_obrana=obrana;
        m_mec=0;
        m_brneni=new Brneni(silaBrneni);
    }
    void seberMec(Mec*mec){
        m_sila=m_sila+mec->getSila();
    }

    void odhodMec(Mec*mec){
    m_sila=m_sila-mec->getSila();
    }
    int getBrneni(){
        return m_brneni->getObrana();
    }


    void printInfo(){
    cout<<"Sila Hrdina: "<<m_sila<<endl;
    cout<<"Obrana Hrdiny: "<<m_obrana<<endl<<endl;
    cout<<"Sila Brneni: "<<m_brneni<<endl;
    }

    ~Hrdina(){
       delete m_brneni;
    }
};

int main()
{
    Mec*zlaty = new Mec(100);
    Hrdina*Tomas = new Hrdina(1500,500, 856465);
    Tomas->seberMec(zlaty);
    Tomas->printInfo();
    Tomas->odhodMec(zlaty);
    Tomas->printInfo();


    return 0;
}

Dobrý den,
má problém s vytvořením kompozice. Vytvořil jsem třídu brnění, kterou bych chtěl mít se třídou hrdina spojen kompozicí, ale s nějakého pro mě nevysvětlitelného důvodu to nefunguje a místo toho, aby mi to vypisovalo sílu brnění, tak se mi tam vypisuje nějaký nesmysl (0x980d90). 

Děkuji všem za radu. 

Nahlásit jako SPAM
IP: 91.219.240.–
Reklama
Reklama
ingiraxo+15
Grafoman
2. 11. 2014   #2
-
+1
-
Zajímavé

#1 Tomas
jasně, však se pozornějí podívej na funkci 

printInfo();


a uvidíš, že na to přijdeš ;)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tomas
~ Anonymní uživatel
510 příspěvků
2. 11. 2014   #3
-
0
-

#2 ingiraxo
Aha, jasný. 

A dalo by se nějak udělat aby se ta síla toho brnění přičítala k obraně hrdiny?

Nahlásit jako SPAM
IP: 91.219.240.–
ingiraxo+15
Grafoman
2. 11. 2014   #4
-
0
-

#3 Tomas
jasně, prostě při přidání brnění přičteš hodnotu brnění k celkový a při odebrání brnění ji zase odečteš

narychlo udělaná ukázka (úprava toho cos psal) 

#include <iostream>
#include <string>

using namespace std;

class Predmet
{
public:
    Predmet(string nazev) : nazev(nazev) {}

    string getNazev() const
    {
        return nazev;
    }

    virtual string toString()
    {
        return nazev;
    }

private:
    string nazev;
};

class Mec : public Predmet
{
public:
    Mec(string nazev, int poskozeni) : Predmet(nazev)
    {
        this->poskozeni = poskozeni;
    }

    int getPoskozeni() const
    {
        return poskozeni;
    }

    virtual string toString()
    {
        string msg = Predmet::toString();
        msg += " (";
        msg += to_string(poskozeni);
        msg += ")";
        return msg;
    }

private:
    int poskozeni;
};

class Brneni : public Predmet
{
public:
    Brneni(string nazev, int obrana) : Predmet(nazev)
    {
        this->obrana = obrana;
    }

    int getObrana() const
    {
        return obrana;
    }

    virtual string toString()
    {
        string msg = Predmet::toString();
        msg += " (";
        msg += to_string(obrana);
        msg += ")";
        return msg;
    }

private:
    int obrana;
};

class Hrdina
{
public:
    Hrdina(string jmenoHrdiny, int obrana, int utok) : jmenoHrdiny(jmenoHrdiny), obrana(obrana), utok(utok) {}
    
    ~Hrdina() {
        odhodMec();
        odhodBrneni();
    }

    void setMec(string nazevMece, int poskozeni)
    {
        odhodMec();
        this->mec = new Mec(nazevMece, poskozeni);
        this->utok += poskozeni;
    }

    void setBrneni(string nazevBrneni, int obrana)
    {
        odhodBrneni();
        this->brneni = new Brneni(nazevBrneni, obrana);
        this->obrana += obrana;
    }

    void odhodMec()
    {
        this->utok -= mec ? mec->getPoskozeni() : 0;
        delete mec;
        mec = NULL;
    }

    void odhodBrneni()
    {
        this->obrana -= brneni ? brneni->getObrana() : 0;
        delete brneni;
        brneni = NULL;
    }

    const Brneni* getBrneni() const
    {
        return brneni;
    }

    const Mec* getMec() const
    {
        return mec;
    }

    int getCelkovyUtok() const
    {
        return utok;
    }

    int getCelkovaObrana() const
    {
        return obrana;
    }

    void vypis()
    {
        cout << "Jmeno hrdiny: " << jmenoHrdiny << endl;
        cout << "Mec: " << (mec ? mec->toString() : "neni") << endl;
        cout << "Brneni: " << (brneni ? brneni->toString() : "neni") << endl;
        cout << "Celkovy utok: " << utok << endl;
        cout << "Celkova obrana: " << obrana << endl;
    }

private:
    string jmenoHrdiny;
    Mec* mec;
    Brneni* brneni;

    int obrana;
    int utok;
};

int main()
{
    Hrdina hrdina("Franta", 10, 22);
    hrdina.setMec("Epicky mec bohu", 15);
    hrdina.setBrneni("Rezave brneni", 54);
    hrdina.vypis();
    cout << endl;
    hrdina.odhodMec();
    hrdina.vypis();

    cin.get();
    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tomas
~ Anonymní uživatel
510 příspěvků
2. 11. 2014   #5
-
0
-

#4 ingiraxo
Ty si asi špatně pochopil, jak jsem to myslel nebo já špatně chápu kompozici, protože jsem si myslel, že když se někde udělá kompozice, tak je ta třída s tou druhou třídou pevně spojena. Takže vznikají spolu a zároveň i spolu zanikají. 
 

A já nevím, jak mám udělat, když mám tu sílu brnění v konstruktoru, tak aby se mi přičetla k obraně. To že bych si ji tma případně mohl nasetovat, tak to chápu a to mi i funguje, ale nevím zda to jde rovnou s toho konstruktoru tu hodnotu použít a přičíst k obraně. 

Nahlásit jako SPAM
IP: 91.219.240.–
ingiraxo+15
Grafoman
2. 11. 2014   #6
-
0
-

noo kompozice je takový skládání většího objektu z menších částí, aby vznikla jednodušší logika a kód byl znovupoužitelnej...  důležitý je, že komponenty by NEMĚLI jít vytvořit samostatně (v tomhle případě bez Hrdiny)

spíše bych použil agregaci, než kompozici.. správně by kompoziční objekt měl mít odkaz na hlavní objekt, kterýmu patří a při zaniknutí hlavního objektu zrušit všechny jeho komponenty

logicky - proč by meč nebo brnění nemohlo existovat samostatně bez hrdiny? takže kompozici bych osobně nepoužil

spíš jsem reagoval na tvoji otázku se součtem obrany/síly.. a že meč a brnění by měli mít nějakýho společnýho rodiče (lépe navrhnout objekty)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tomas
~ Anonymní uživatel
510 příspěvků
2. 11. 2014   #7
-
0
-

#6 ingiraxo
Jo s tím souhlasím, že by se hodila spíš agregace, ale tohle bylo jenom tak na zkoušku, jestli jsem pochopil danou látku a nic mě nenapadlo tak jsem zkusil udělat hrdiny který by prostě měl "od narozeni" brnění a právě v té kompozici jsem neviděl, zda se dá nějak přičíst ta síla toho brnění co je v konstruktoru k obraně hrdiny, protože to mě nějak nefunguje. 


A ohledně těch společných rodičů, tak to jsem se ještě neučili. 

Nahlásit jako SPAM
IP: 91.219.240.–
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, 99 hostů

Podobná vlákna

Moderátoři diskuze

 

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