Re: Ukazka C++ pro děti

Pavel Brychta pavel.brychta na duhasys.eu
Čtvrtek Duben 1 06:38:54 CEST 2021


Když už jsme se dostali k přetěžování operátorů, tak by bylo dobré 
zmínit i šablony (templates), které s přetížením můžou souviset a umožní 
vytvořit konverze mezi jednotlivými datovými typy. No a odtud je pak už 
jen krůček k polymorfním objektům, které, jak jsem se zde dozvěděl, by 
měly na 8-bitech "vadit", což považuji za blábol, protože je běžně 
používám a paradoxně paměť RAM jejich použitím spíš šetřím (asi to 
používám "v míře menší, než zanedbatelné", nebo to prostě to AVRko neví, 
tak mu to nevadí). V každém případě mi právě polymorfní objekty v praxi 
pomohly pár věcí vyřešit hodně elegantní cestou, takže bych je 
neopomenul zmínit...

Pavel Brychta

Dne 31. 03. 21 v 19:36 Pavel Hudecek napsal(a):
>
> Každý „úhel pohledu“, alias programovací technika je vhodný pro jiné 
> účely. Pro matematické operace je to celkem jedno, jen je jasné, že
>
> X = (4+a/1280)*b^3
>
> je poněkud přehlednější než 50 řádků kódu v assembleru a poněkud 
> snadněji se to bude upravovat.
>
> Jiná věc je, když ten výpočet bude třeba součástí hry. Místo X pak 
> bude třeba hracX a ten bude mít ještě Y, Z, dva úhly kam kouká, 3 
> složky vektoru pohybu, zdraví, počet nábojů, … a pak tam budou ještě 
> potvoráci a ti mají podobné vlastnosti.
>
> Snadno dojdeme k tomu, že než vytvářet 30 proměnných s názvem 
> začínajícím hrac a 30 polí pro všechny breberáky, bude lepší udělat 
> nějakou strukturu, která popisuje, jaký všechny vlastnosti může mít 
> aktivní objekt v tý hře a všechny hráče a breberáky pak udělat podle něj.
>
> Takže místo deklarace
>
> Int hracX, hracY, hracZ, …
>
> Int breberaciX[10], breberaciY[10], …
>
> Uděláme strukturu
>
> Typedef struct tObjekt {
>
>                 Int x, y, z, …
>
> }
>
> A potom deklaruju:
>
> tObjekt hrac
>
> tObjekt breberaci[10]
>
> a pak budu pracovat s hrac.x, breberaci[6].y, … a bude to mnohem 
> jasnější, protože seznam těch vlastnstí je na jednom místě. Jelikož C 
> má i poitery na funkce, můžu si do tý struktury přidat i funkce a tak 
> když hráč zmáčkne fire, vyvolá něco jako hrac.strilet(2,125,38,64)
>
> přičemž 2 je druhá zbraň z inventáře a zbytek vektor směru.
>
> Už tady začíná být jasné, že by to možná chtělo víc úrovní struktur, 
> takže poloha bude třeba ve struktuře tXYZ, která obsahuje x,y,z. Takže 
> pak můžu mít funkci, která má parametry tohoto typu, či takový typ vrací.
>
> Takže máme hrac.poloha.x, ale to X nás už většinou nezajímá. My třeba 
> napíšeme:
>
> If (vzdalenost(hrac.poloha, breberaci[5].poloha) 
> <breberaci[5].plamen.dosah)
>
> {
>
> hrac.poskodit(breberaci[5].plamen.dmgPerSec).
>
> }
>
> Tak jsme se dostali ke strukturálnímu programování.
>
> No ale hra je rozsáhlá, takže jí programuje 15 lidí a můžou vznikat 
> zmatky. Proto místo místo struktury použijeme objekt, což znamená, že 
> místo struct bude class a jinak je všechno stejný. Teda až na to, že 
> v class můžou bejt sekce public, private, protected, friend a možná 
> ještě něco. A já, jako autor toho class nadefinuju, který věci mám 
> svoje a zvenku nejsou vidět, tudíž do nich kolega omylem nezasáhne a 
> do jakých může zasahovat okolí apod.
>
> A v případě C++ nám z pod klávesnice vylez ještě jeden termit jménem 
> přetěžování operátorů.
>
> Pro class vektor si můžu nedefinovat, jak vypadají operace 
> odpovídající běžným operátorům, takže když hráč vyleze na žebřík, 
> nastane hrac.poloha = hrac.poloha+zebrik.vektor.
>
> Když už jsme u toho, ví tu někdo, proč se to menuje zrovna přetěžování?
>
> PH
>
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210401/a5de6308/attachment.html>


Další informace o konferenci Hw-list