Programování v C++

Připomenutí: The Rule of Five

Pokud měníte chování, implementujete, jednu z následujících metod. Měli byste implementovat všechny, aby bylo chování konzistentní.


class MyClass {
  // Copy constructor.
  MyClass(const MyClass& other) { }
  // Assignment operator.
  MyClass& operator=(const MyClass& other) { }
  // Move constructor.
  // Can be defined without noexcept.
  // Presence of noexcept allow use in some algorithms.
  MyClass(MyClass&& other) noexcept { }
  // Move assignment operator.
  MyClass& operator=(MyClass&& other) { }
  // Destructor should not throw an exception.
  ~MyClass() noexcept {}
}
  

Toto je důležité zejména z pohledu standardních algoritmů, které na tyto funkce spoléhají. Dalším důvodem je zachování příčetnosti programátorů pracujících na daném kódu.

Cvičení: Algoritmy ze standardní knihovny

Umístění: ./labs/08-standard-library/

Čas: 45 minut

Modul 'algorithm' obsahuje hromadu užitečných algoritmů, zejména pro práci s kontejnery. V přiloženém souboru je řada TODO, které je třeba implementovat pomocí algoritmů. Před každým TODO jsou uvedeny relevantní algoritmy/pojmy, které by Vás měli navést na řešení. Pro každé TODO se očekává použití jen jednoho algoritmu.

Při implementaci doporučuji začít na stránkách c++ dokumentace. Stránky obsahují příklady, které Vám umožní implementovat řešení rychle. Navíc jde o možnost procvičit si práci s dokumentací.

Očekávané hodnoty výstupu jsou uvedeny v závorce na standardním výstupu při spuštění programu.

Zdrojový kód.

Vybrané moduly ze standardní knihovny

Pro vyzkoušení příkladu nezapomeňte nastavit C++ Language Standard na C++20.

chrono

Modul pro práci s časem a intervaly.

random

Modul pro generování náhodných čísel z různých distribucí.

filesystem

Modul pro práci se souborovým systémem. Obsahuje také funkce pro práci s adresáři, iterování, mazání, atd..


Ukázka použití v kódu.

ranges

Řeší problém složitějšího řetězené operací ze standardní knihovny. Inspirace funkcionálním přístupem.


Ukázka použití v kódu.

Dědičnost a specializace chování

Jedním z důvodu využití dědičnosti je sdílení chování a dat mezi různými třídami.

Virtuální metody jsou jedním způsobem jak implementovat třídě specifické chování. Tento přístup je zejména vhodný, pokud je chování přístupné skrze metody na třídě. Například metoda "makeSound" může mít různé implementace pro kočku, delfína, nebo poníka.

V některých případech ale nemusí být implementace různých metod na objektu možná nebo žádoucí. Pokud je možné implementovat alespoň vybrané generické metody, je možné kód specifický pro danou třídu implementovat i mimo třídu samotnou. Příklad je třeba návrhový vzoru Visitor. Ten umožňuje přidávat specifické chování, bez nutnosti zásahu do původních tříd.

Cvičení: static_cast

Umístění: ./labs/08-static-cast/

Čas: 10 minut

V některých případech není možné nebo žádoucí využít jakýchkoliv metod. V takovém případě je možné provést manuální konverzi z jednoho typu na druhý a to zejména na typ specializovaný. Jinými slovy, přetypovat z rodiče na potomka.

K takovému přetypování je možný využít konstrukty jako: static_cast, dynamic_cast a reinterpret_cast. Využití C syntaxe zápisem "(type)hodnota" není žádoucí.

static_cast je možné použít na přetypování na potomka (downcast), pouze tehdy, pokud jsem si absolutně jistí, že jde o instanci dané třídy. Tato konverze není za běhu kontrolovaná a špatné použití vede na nedefinované chování! Detaily ohledně přetypování jsou probírány na přednášce.

Zdrojový kód.