Warning
This page is located in archive. Go to the latest version of this course pages.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
courses:b6b36pjc:ukoly:jednohubky [2018/11/23 00:02]
jerabma7 [06 – Nevirtuální a virtuální rozhraní]
courses:b6b36pjc:ukoly:jednohubky [2018/12/07 16:59]
richta [07 – Simulace kovariantních návratových typů s chytrými ukazately]
Line 182: Line 182:
 [[https://​en.wikibooks.org/​wiki/​More_C%2B%2B_Idioms/​Non-Virtual_Interface|WikiBooks]] [[https://​en.wikibooks.org/​wiki/​More_C%2B%2B_Idioms/​Non-Virtual_Interface|WikiBooks]]
 obsahuje dobré vysvětlení v angličtině. obsahuje dobré vysvětlení v angličtině.
 +
 +
 +==== 07 – Simulace kovariantních návratových typů s chytrými ukazateli ====
 +
 +Jak jsme si ukazovali na cvičení, v C%%++%% nelze kombinovat kovariantní
 +návratové typy s chytrými ukazateli, jako je například ''​std::​unique_ptr''​.
 +Nicméně, chytrou kombinací nevirtuálního rozhraní, schovávání,​ virtuálního
 +rozhraní a boilerplate,​ se dá kovariance simulovat.
 +
 +V této jednohubce budete znovu pracovat s hierarchií tříd které generují
 +náhodná čísla a vaším úkolem bude doplnit metodu ''​clone'',​ která vrací
 +příslušně konkretizovaný ''​std::​unique_ptr''​ a zároveň se chová polymorfně.
 +
 +
 +Projekt s implementací a testy najdete
 +{{:​courses:​b6b36pjc:​ukoly:​tiny-07.zip|zde}}.
 +
 +Do Brute odevzdejte i vámi změněnou hlavičku ''​tiny-07.hpp''​.
 +
 +=== Rady ===
 +
 +Je jasné, že metoda ''​clone''​ nemůže být virtuální,​ ale pro její správné
 +chování potřebujete virtuální polymorfismus. Jinak řečeno, budete muset
 +těch metod implementovat více.
 +
 +
 +==== 08 – Jednoduchá šablonová funkce ====
 +
 +V této jednohubce si napíšete jednoduchou šablonovou funkci ''​clamp''​.
 +Tato funkce se v C%%++%%17 stala součástí standardní knihovny, ale protože
 +v tomto předmětu používáme tento semestr stále ještě C%%++%%14, budeme ji
 +implementovat my.
 +
 +Funkce ''​clamp''​ má dvě přetížení
 +    * ''​T const& clamp(T const& value, T const& low, T const& high)''​
 +    * ''​T const& clamp(T const& value, T const& low, T const& high, Compare cmp)''​
 +
 +které vrací ''​low''​ pokud ''​value''​ je menší než ''​low'',​ ''​high''​ pokud
 +''​value''​ je větší než ''​high''​ a jinak ''​value''​. Jinak řečeno, ''​value''​
 +je omezeno do rozsahu ''​[low,​ high]''​. První overload předpokládá,​ že
 +''​T''​ je porovnatelné pomocí operátoru ''<'',​ druhý overload pak bere
 +vhodný komparátor jako 4. argument.
 +
 +Projekt s implementací a testy najdete
 +{{:​courses:​b6b36pjc:​ukoly:​tiny-08.zip|zde}}.
 +
 +Do Brute odevzdejte vaši hlavičku ''​tiny-08.hpp''​.
 +
 +=== Rady ===
 +
 +Není potřeba implementovat obě funkce stejně, můžete implementovat jednu
 +voláním druhé. K tomu se vám bude hodit obsah hlavičky
 +[[https://​en.cppreference.com/​w/​cpp/​header/​functional|functional]].
 +
 +=== Další ===
 +
 +K této jednohubce vám navíc nabízíme dvě otázky k zamyšlení:​
 +    * Pokud uživatel předá parametry ve špatném pořadí, může dostat špatný výsledek. Toto se dá opravit, pokud funkci přejmenujeme((A změníme implementaci tak, aby odpovídala novému jménu)). Jaké jméno by to bylo?
 +    * ''​const int& clamped = clamp(value,​ 0, 255);''​ může vést k chybě. K jaké? Jde to rozumně opravit?
 +
  
courses/b6b36pjc/ukoly/jednohubky.txt · Last modified: 2018/12/14 12:43 by jerabma7