Jedním ze základních konceptů v programování v C++ je používání tříd. Třídy slouží jako šablony pro vytváření objektů a pomáhají organizovat data a chování do znovupoužitelných struktur.
Deklarace třídy v C++
Deklarace třídy v C++ má jednoduchou strukturu. Používáme rezervované klíčové slovo class, následované názvem třídy. Třídy zpravidla pojmenováváme tak, aby jejich názvy začínaly velkým písmenem, což zvyšuje čitelnost a udržovatelnost kódu.
class Player {
  // Tělo třídy
};
Deklarace třídy je uzavřena do složených závorek a musí být ukončena středníkem ;. Uvnitř těla třídy můžeme definovat atributy (datové členy) a metody (funkce), které určují chování třídy.
Příklad: Definice třídy Player
V herní aplikaci můžeme chtít definovat třídu Player, která obsahuje atributy jako name (jméno), health (zdraví) a xp (zkušenostní body). Můžeme také definovat metody jako talk(), která umožní hráči mluvit, a is_dead(), která zjistí, zda je hráč stále naživu.
#include <iostream>
#include <string>

class Player {
private:
  std::string name;
  int health;
  int xp;
public:
  // Konstruktor
  Player(std::string n, int h, int x)
      : name(n), health(h), xp(x) {}

  // Metoda pro mluvení
  void talk(std::string text_to_say) {
      std::cout << name << " říká: " << text_to_say << std::endl;
  }

  // Metoda pro kontrolu, zda je hráč mrtvý
  bool is_dead() {
      return health <= 0;
  }
};
Vytváření objektů z třídy Player
Jakmile jsme definovali třídu Player, můžeme vytvořit objekty (instance třídy) v naší hlavní funkci:
auto main() -> int {
  Player player("Eddie", 100, 10); // Objekt vytvořený na zásobníku
  player.talk("Ahoj, světe!");

  if (player.is_dead()) {
      std::cout << "Hráč je mrtvý.
";
  } else {
      std::cout << "Hráč je naživu.
";
  }
}
Zde je objekt player vytvořen na zásobníku (stack), což znamená, že jeho paměť je automaticky spravována a uvolněna, jakmile objekt vyjde z dosahu (scope).
Použití ukazatelů a alokace na haldě
V C++ můžeme vytvořit ukazatele na objekty, což umožňuje dynamickou alokaci paměti.
Player *enemy = new Player("Nepřítel", 50, 5);
delete enemy;
Zde dynamicky alokujeme paměť pro objekt Player na haldě (heap) pomocí klíčového slova new. Objekt je poté odstraněn pomocí delete, aby se uvolnila paměť.
Tento přístup je obzvláště užitečný při práci s velkými objekty nebo při ruční správě jejich životního cyklu.
Příklad: Definice třídy Account
Kromě her jsou třídy užitečné i pro jiné aplikace, například pro správu bankovních účtů. Níže je příklad třídy Account:
class Account {
private:
  std::string name;
  double balance;

public:
  bool withdraw(double amount);
  bool deposit(double amount);
};
Tato třída obsahuje atributy jako name (jméno) a balance (zůstatek) spolu s deklaracemi metod withdraw() (výběr peněz) a deposit() (vklad peněz). Skutečná implementace těchto metod by byla definována mimo tělo třídy.
#include <iostream>
#include <string>

class Account {
private:
  std::string name;
  double balance;

public:
  // Konstruktor
  Account(std::string n, double b) : name(n), balance(b) {}

  // Deklarace metod
  bool withdraw(double amount);
  bool deposit(double amount);
};

// Implementace metody deposit()
bool Account::deposit(double amount) {
  if (amount > 0) {
      balance += amount;
      std::cout << "Vlozeno: " << amount << ", novy zustatek: " << balance << std::endl;
      return true;
  }
  return false;
}

// Implementace metody withdraw()
bool Account::withdraw(double amount) {
  if (amount > 0 && amount <= balance) {
      balance -= amount;
      std::cout << "Vybrano: " << amount << ", novy zustatek: " << balance << std::endl;
      return true;
  }
  std::cout << "Nedostatecny zustatek nebo neplatna castka." << std::endl;
  return false;
}

auto main() -> int {
  Account myAccount("John Doe", 1000.0);

  myAccount.deposit(500.0);   // Vklad 500
  myAccount.withdraw(200.0);  // Výběr 200
  myAccount.withdraw(1500.0); // Pokus o výběr nad zůstatek
}