#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í