<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>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...<br>
</p>
<p>Pavel Brychta<br>
</p>
<div class="moz-cite-prefix">Dne 31. 03. 21 v 19:36 Pavel Hudecek
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:6E.S7hUJ.5R5Te5PMCfc.1WPBCp@seznam.cz">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}.MsoChpDefault
{mso-style-type:export-only;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal">Každý „úhel pohledu“, alias programovací
technika je vhodný pro jiné účely. Pro matematické operace je
to celkem jedno, jen je jasné, že </p>
<p class="MsoNormal">X = (4+a/1280)*b<span lang="EN-US">^3<o:p></o:p></span></p>
<p class="MsoNormal">je poněkud přehlednější než 50 řádků kódu
v assembleru a poněkud snadněji se to bude upravovat.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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.</p>
<p class="MsoNormal">Takže místo deklarace</p>
<p class="MsoNormal">Int hracX, hracY, hracZ, …</p>
<p class="MsoNormal">Int breberaciX<span lang="EN-US">[10],
breberaciY[10], …<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Ud</span>ěláme strukturu</p>
<p class="MsoNormal">Typedef struct tObjekt <span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> Int x,
y, z, …<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">A potom deklaruju:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">tObjekt hrac<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">tObjekt breberaci[10]</span></p>
<p class="MsoNormal">a pak budu pracovat s hrac.x, breberaci<span
lang="EN-US">[6].y, … a bude to mnohem j</span>asně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>
<p class="MsoNormal">přičemž 2 je druhá zbraň z inventáře a
zbytek vektor směru.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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í.</p>
<p class="MsoNormal">Takže máme hrac.poloha.x, ale to X nás už
většinou nezajímá. My třeba napíšeme:</p>
<p class="MsoNormal">If (vzdalenost(hrac.poloha, breberaci<span
lang="EN-US">[5]</span>.poloha) <span lang="EN-US"><</span><span
lang="EN-US"> </span>breberaci<span lang="EN-US">[5]</span>.plamen.dosah)</p>
<p class="MsoNormal">{</p>
<p class="MsoNormal">hrac.poskodit(breberaci<span lang="EN-US">[5].plamen</span>.dmgPerSec).</p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Tak jsme se dostali ke
struktu</span>rálnímu programování.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">A v případě C++ nám z pod klávesnice vylez
ještě jeden termit jménem přetěžování operátorů.</p>
<p class="MsoNormal">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.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Když už jsme u toho, ví tu někdo, proč se
to menuje zrovna přetěžování?</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">PH</p>
<p class="MsoNormal"><o:p> </o:p><br>
</p>
</div>
</blockquote>
</body>
</html>