Programování v C++


Inspired by Martin Svoboda.

Cíle cvičení

  • Cvičení: Třída MediaContent
  • Demonstrace: Polymorphismus
  • Cvičení: Reprezentace filmů a seriálů
  • Cvičení: JSON
  • Demonstrace: Move sémantika
  • Cvičení: Konstrukce filmů
  • Cvičení: Import ze souboru
  • Cvičení: Dotazy

Cvičení: Třída MediaContent

Umístění: 05-movie-database

Čas: 6 minutes

Vytvořte třídu MediaContent, která reprezentuje multimediální obsah. Třída musí umožnit reprezentovat následující:

  • name - std::string
  • genre - std::string
  • rating - unsigned short
  • cast - std::set<std::string>

Definujte parametrický konstruktor se všemy atributy. Dále definujte funkce pro přístup k datům s vhodným využitím inline funkcí.

Demonstrace: Polymorphismus

  • Inheritance
  • virtual methods
  • virtual destructor
  • override
  • statické metody
  • Hlavičkové soubory, makroprocesor, guards
  • Nepoužívat "#pragma once"!
  • enum class

Cvičení: Reprezentace filmů a seriálů

Umístění: 05-movie-database

Čas: 10 minutes

Vytvořte třídu Movie, pro reprezentaci filmů, jako rozšíření třídy MediaContent o následující obsah:

  • release year - unsigned int

Vytvořte třídu Show, pro reprezentaci seriálů, jako rozšíření třídy MediaContent o následující obsah:

  • seasons count - unsigned short

Pro obě třídy definujte funkce pro přístup k datům.

Cvičení: JSON

Umístění: 05-movie-database

Čas: 10 minutes

Přidejte následující pure virtual metodu pro serializaci do třídy MediaContent.


      virtual std::string as_json() const = 0;
    

Implementujte metody v potomc9ch tak, aby produkovala ekvivalent následujícího výstupu.


      { "name": "Final Fantasy: Esence života", "genre": "sci-fi", "rating": 67, "cast": ["Alec Baldwin", "Ving Rhames"], "release year": 2001 }
    

Pokud není uvedený žádný herec, pole "cast" vůbec nevypisujte.

Demonstrace: Move sémantika

  • r-value
  • std::move
  • push_back, push_back, emplace_back

Cvičení: Konstrukce filmů

Umístění: 05-movie-database

Čas: 10 minutes

Cílem je rozšířit třídu tak, aby bylo možné její efektivní vytvoření.

Implementujte parametrické konstruktory, který bude přijímat r-value reference pro: jméno, žánr a jména herců. Dále implementujte move konstruktor a move assignment. Vyzkoušejte vložení do std::vector pomocí push_back(...), push_back(std::move(...)), emplace_back(...).

Vložení bude třeba provádět do různých vektorů, stačí implementace pro jednu třídu.

Cvičení: Import ze souboru

Umístění: 05-movie-database

Čas: N/A

Rozšiřte svoji implementaci o možnost načtení databáze filmů z CSV souboru.

CSV soubor používá středník jako oddělovač sloupců. Herci jsou ve svém sloupci odděleni pomocí čárky. Můžete předpokládat, že CSV soubor obsahuje vždy hlavičku na prvním řádku. V hlavičce jsou následující sloupce: name, type, genre, rating, cast, release year, seasons count. Sloupec type obsahuje hodnoty "movie" nebo "show" pro film, nebo seriál.

Funkcionalitu implementujte jako statické funkce třídy MultimediaDatabase.


bool import_csv(const std::string& filename, std::vector<Movie>& movies, std::vector<Show>& shows);

bool import_csv(std::istream& stream, std::vector<Movie>& movies, std::vector<Show>& shows);
    

Fukce vrací false, pokud se načtení nepovedlo.

Jde o ideální příležitost otestovat dříve implementovaný CSV parser :)