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