Portál AbcLinuxu, 15. června 2025 11:54


Dotaz: vytvoření pole objektů, které jsou různí potomci třídy v C++

17.3.2009 18:42 bestik
vytvoření pole objektů, které jsou různí potomci třídy v C++
Přečteno: 2982×
Odpovědět | Admin

dobrý den,

Měl bych dotaz.

Vytvořil jsem si jednu třídu CZamestnanci a 2 potomky CVojak a COz.

vytvořil jsem si pole objektů třídy CZamestnanec :

CZamestnanec *lide[100];

nyní bych chtěl vytvářet objekty (potomky) CVojak a COz

pokud vsak vytvorim objekt takto : lide[0] = new CVojak tak objekt lide[0] je stále třídy CZamestanci.

Nevíte jak to udělat tak aby mohl vytvářet prvky pole třídy CVojak nebo COz podle toho jaky typ zrovna chci?

děkuji za odpověď

 

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

AraxoN avatar 17.3.2009 19:08 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin

Disclaimer: v C++ som nikdy nič užitočné nenaprogramoval a vedomosti mám viacmenej len zo školy, takže tento komentár berte s rezervou.

K Tvojmu problému: pokiaľ viem, tak on to je CVojak, ale tým že k nemu pristupuješ cez typ CZamestnanec *, tak s ním môžeš robiť len ako s CZamestnancom. Keď chceš volať metódy zdedených tried, tak tie metódy musia byť virtual a keď chceš prístupiť k dátam toho CVojaka, tak to jedine, že si ten smerník predtým pretypuješ.

kozzi avatar 17.3.2009 19:16 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
To dost dobře nejde. Jelikož tím že to pole je typu Y tak nemůžeš chtít aby uchovávalo informace o typu X. Přiřadit X do Y můžeš jelikož C++ ví že se ejdná o třídu zděděnou a tak jí poníží na tu úroveň toho zamestanance, ale zpětně to nejde. ALe můžeš ten objekt zase přetypovat.
#include <iostream>
using namespace std;

class Zamestnanec{
	public:
	void setNazev(){cout << "Nazev";}
	void setJidlo(){cout << "Jidlo";};
};

class Debil : public Zamestnanec{
	public:
	void setZadrz(){cout << "Zadrz";};
};

class Kokot : public Zamestnanec{
	public:
	void setOjeb(){cout << "Ojeb";};
};

int main(int argc, char** argv)
{
	Zamestnanec *pole[100];
	pole[0] = (Debil*) new Debil();
	pole[1] = new Kokot();
	((Debil*)pole[0])->setZadrz();
	return 0;
}
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
17.3.2009 19:21 bestik
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++

Děkujimoc. Zachránil jsi mi život...Tohle funguje bezvadně :-)


kozzi avatar 17.3.2009 19:26 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
mimochodem neni misto pole lepsi pouzivat nektery s kontejneru?
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
17.3.2009 19:49 bestik
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++

To možná jo, ale já jsem příliš velkej začátečník abych věděl co to je


kozzi avatar 17.3.2009 20:21 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
Aha :-D. Tak například vector by se dal použít takto:
#include <iostream>
#include <vector>
using namespace std;

class Zamestnanec{
	public:
	void setNazev(){cout << "Nazev";}
	void setJidlo(){cout << "Jidlo";};
};

class Debil : public Zamestnanec{
	public:
	Debil(int d){
		this->data=d;
	}
	void setZadrz(){cout << this->data;}
	private:
	int data;
};

class Kokot : public Zamestnanec{
	public:
	void setOjeb(){cout << "Ojeb";};
	private:
	int data;
};

int main(int argc, char** argv)
{
	vector<Zamestnanec*> pole;
	pole.push_back((Debil*) new Debil(5));
	pole.push_back(new Kokot());
	((Debil*)pole.at(0))->setZadrz();
	return 0;
}
Výhodou je to že nejsi omezenej na staticky určený počet zaměstnancú.
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
18.3.2009 06:00 luky
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
Jen do určité míry, brzy nashle ;)
kozzi avatar 18.3.2009 13:22 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
:-). Třeba bude mít štěstí ;-)
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
18.3.2009 14:24 Murry | skóre: 16 | Brno
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
Nebude lepší z class Zamestanec udělat abstraktní třídu a posléze nepřetypovávat? Př.
class Zamest {
public:
 virtual void setNazev() = 0;
 virtual int plat() = 0;
 void spolecne_veci(parametry..);
}

class Programator : public Zamest{
public:
 void setNazev() { cout << "aaaaaaaaa"; }
 int plat() { return 10000000; }
 .......
}

class Uklizecka : public Zamest {
public:
 void setNazev() { cout << "bbbbbbb"; }
 int plat() { return 5; }
.........
}
............
Zamest *pole[100];
pole[0] = new Uklizecka();
......
Takto bych to řesil já;-)
18.3.2009 23:47 xyz
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin

Ach jo, jak vidim na blbou otazku, blbe odpovedi... Proboha lidi, kdyz uz se pta zacatecnik, tak mu poradte tak, aby mu to alespon k necemu bylo!

Pokud bych se mel drzet zadani a prihlednu ke stavajicim odpovedim, tak to uz muzete rovnou pouzit toto (radsi explicitne rikam: TAKTO NE!):

void* pole[SIZE];
pole[0] = new Jenicek;
pole[1] = new Marenka;
((Jenicek*) pole[0])->vidimSvetylkoVDali((*Marenka)pole[1]);

Divim se, ze se nikdo nezeptal, jak a proc se k jednotlivym prvkum bude pristupovat. Pokud cilem je pouze volat virtualni metody prvku kontejneru, tak je naprosto zbytecne toto vubec resit. Pokud je nutne k jednotlivym prvkum pristupovat odlisne v zavislosti na jejich typu (predpokladam, ze jsou to ruzni potomci jednoho predka), tak to znamena spatny navrh a problem by mel byt vyresen jinak (s vyuzitim virtualnich metod).

Pokud se tomu opravdu nejde vyhnout, tak pro pretypovani predka na potomka se pouziva dynamic_cast (coz je dle meho nazoru prasarna, ale to je opravdu pouze muj nazor), ktere zarucuje typovou kontrolu, takze reseni by vypadalo asi takto.

class BlbecVlese { virtual ~BlbecVLese() {} };
class Jenicek : public BlbecVlese {...};
class Marenka : public BlbecVLese {...};
...
BLbecVLese* blbci[100];
blbci[0] = new Jenicek;
blbci[1] = new Marenka;
...
BlbecVLese* x = blbci[y]; //predpokladany predek 
Jenicek* j = 0;
Marenka* m = 0;

if ( 0 != (j = dynamic_cast<Jenicek*>(x)) )
    j->vylezNaStrom();
else if ( 0 != (m = dynamic_cast<Marenka*>(x)) )
    m->pockejPodStromem();
else
{
    jezibaba->sezer(x);
    throw kosti;
}
...

Omlouvam se za konfliktni ton... Nechci rozpoutavat flame. Jen si myslim, ze rady zacatecnikovy by nemely byt ve smyslu: "chci udelat prasarnu  => nekdo mi poradi jeste vetsi prasarnu jak to realizovat" :-)

kozzi avatar 19.3.2009 01:38 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vytvoření pole objektů, které jsou různí potomci třídy v C++
:-D. No tak když ono to svádělo mu tak poradit :-D. Jinak plně souhlasím stím že bude špatně navrženej už koncept. A dost pochybuji, že jako začátečník by se měl zaobírat věcmi jako dynamic_cast.
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.