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

Vypsání pole – C / C++ – Fórum – Programujte.comVypsání pole – C / C++ – Fórum – Programujte.com

 

Jan
~ Anonymní uživatel
187 příspěvků
17. 11. 2014   #1
-
0
-

 Zdravím, 

potřebuji poradit mám třídu předměty a inventář. V inventáře se ukládají předměty do pole a nevím, jak mám udělat to abych mohl to pole s uloženými předměty vypsat na obrazovku a jak hodnotu atributu m_obrana ze třídy Predmety dostat do třídy Hrdina přes nějakou metodu pouzijNesenyStit prostřednictvím právě té třídy Inventar ve kterém je pole.

Abych to shrnul.

Cílem toho co, chci udělat je to, aby se do inventáře mohlo ukládat neomezené množství předmětů, ale pak při zavolání metody pouzijNesenyStit ve třídě Hrdina by se vybral pouze jeden předmět s pole předmětů v inventáři a ten se přičetl k obraně hrdiny  

class Predmety {
   int m_obrana;
    string m_nazev;

public:
    Predmety (int obrana, string nazev){
        m_obrana=obrana;
        m_nazev=nazev;

        }
    int getObrana(){
        return m_obrana;
    }

    string getNazev(){
        return m_nazev;
    }

};

class Inventar {
     array <Predmety*,10> m_predmety;

public:
    Inventar(){
        for (int i=0; i<<(int)m_predmety.size(); i++) {
        m_predmety.at(i)=0;

        }
    }
    int i=0;
   void kupPredmet(Predmety*stit){
        m_predmety.at(i)=stit;
        i=i+1;
    }
Nahlásit jako SPAM
IP: 91.219.240.–
ingiraxo+15
Grafoman
17. 11. 2014   #2
-
0
-

#1 Jan
No.. v první řadě potřebuje generickou kolekci, protože realokovat pole je vopruz, takže třeba vector bude ideální.. další věc je, že potřebuješ ty předměty od sebe něčím odlišit, něčím, co bude unikátní pro každý předmět, takže ID (doporučuju přidat do předmětu ještě typ (zbran, brneni,...)

takže lehká úprava tvého kódu může vypadat nějak takto.. neznám přímo třídu Hrdina 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

class Predmet
{
public:
    Predmet(int id, string nazev) : id(id), nazev(nazev) {}

    int getId() const { return id; }
    string getNazev() const { return nazev; }

    virtual string toString() const
    {
        stringstream ss;
        ss << id << ";" << nazev;
        return ss.str();
    }

private:
    int id;
    string nazev;
};

class Brneni : public Predmet
{
public:
    Brneni(int id, string nazev, int obrana) : Predmet(id, nazev), obrana(obrana) {}

    int getObrana() const { return obrana; }

    virtual string toString() const
    {
        stringstream ss;
        ss << Predmet::toString() << ";" << obrana << ";";
        return ss.str();
    }

private:
    int obrana;
};

class Zbran : public Predmet
{
public:
    Zbran(int id, string nazev, float utok) : Predmet(id, nazev), utok(utok) {}

    float getUtok() const { return utok; }

    virtual string toString() const
    {
        stringstream ss;
        ss << Predmet::toString() << ";" << utok << ";";
        return ss.str();
    }

private:
    float utok;
};

class Inventar
{
public:
    void kupPredmet(Predmet* predmet)
    {
        if (!predmet) return;
        if (!ziskejPredmet(predmet->getId())) {
            predmety.push_back(predmet);
        }
    }
    void zobraz() const
    {
        vector<Predmet *>::const_iterator it = predmety.begin();
        for (; it != predmety.end(); it++) {
            cout << (*it)->toString() << endl;
        }
    }
    Predmet* ziskejPredmet(int id)
    {
        vector<Predmet *>::const_iterator it = predmety.begin();
        for (; it != predmety.end(); it++) {
            if ((*it)->getId() == id) {
                return *it;
            }
        }
        return NULL;
    }
    vector<Brneni *> ziskejVsechnyBrneni() { return ziskejVsechny<Brneni>(); }
    vector<Zbran *> ziskejVsechnyZbrane() { return ziskejVsechny<Zbran>(); }

private:
    vector<Predmet *> predmety;

    template <class T>
    vector<T *> ziskejVsechny()
    {
        vector<T *> list;
        vector<Predmet *>::const_iterator it = predmety.begin();
        for (; it != predmety.end(); it++) {
            T* t = dynamic_cast<T *>(*it);
            if (t) {
                list.push_back(t);
            }
        }
        return list;
    }
};

int main()
{
    Brneni p1(1, "Lehke brneni", 10);
    Brneni p2(2, "Super brneni", 20);
    Zbran z1(3, "Mec bohu", 5.6f);

    Inventar inv;
    inv.kupPredmet(&p1);
    inv.kupPredmet(&p2);
    inv.kupPredmet(&z1);
    inv.zobraz();

    Predmet* stit = inv.ziskejPredmet(2);
    if (stit) {
        cout << stit->toString();
    } else {
        cout << "Predmet s ID " << 2 << " neexistuje!";
    }

    vector<Brneni *> brneni = inv.ziskejVsechnyBrneni();
    vector<Zbran *> zbrane = inv.ziskejVsechnyZbrane();

    return EXIT_SUCCESS;
}

Jinak nepoužívej zbytečný alokace, když to není potřeba, akorát se pak musíš starat o jejich uvolnění

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

#2 ingiraxo
Můžu se ještě zeptat na jakém principu funguje virtual string a stringstream?

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

#3 Jan
virtual tam mám z důvodu přepisování metody toString(), protože u Zbrane a Brneni chci ponechat stejný název jako má Predmet

stringstream tam je pouze z důvodu snažšího spojování stringu a čísel

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
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, 29 hostů

Podobná vlákna

Vypsání z databáze do pole — založil hhacker

Vypsání — založil Karel

Vypsani stringu — založil Tase

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ý