3. díl - Třídy, atributy a metody

C++ Pokročilé konstrukce Zdrojákoviště Dočasná kategorie Třídy, atributy a metody

Jak už je z názvu "Objektově orientované progrmaování" patrné, stavebním kamenem budou objekty. Je to paradox, ale není to tak úplně pravda. Drtivá většina jazyků, které se reprezentují jako OOP (C++, Java nebo C#) totiž objekty jako pojem nezná. Proč je tomu tak? To se dozvíme dnes.

Třída

Třídy byly zmíněny již v minulém díle. Jedná se o takový recept, podle kterého se výsledý "objekt" vytvoří. Vezněme si například třídu Člověk. Každý člověk zřejmě bude mít nějakou výšku, nějaké jméno, nějaký věk a další charakteristické vlastnosti. Ve třídě neříkáme, že Pavel má oči modré, zatímco Rudolf hnědé. Třída Člověk bude mít pouze informaci o tom, že každý člověk má nějakou barvu očí, nějaké jméno a nějakou výšku. Až při vytvoření "objektu" určíme, o koho se vlastně jedná. Určíme to jednoduše - přiřadíme mu jméno, výšku a další věci, kterými ho jednoznačně určíme. Tyto vlastnosti, které mohou (ale nemusí!) být jedinečné každému objektu se nazývají atributy. Budeme-li brát v úvahu všechny atributy, poté se někdy mluví o vnitřním stavu objektu, ale o tom až později. Pojďme si nyní společně vytvořit takovou třídu, která bude reprezentovat člověka.

Nejdříve si vytvoříme nový projekt. Poté klikneme pravým tlačítkem myši na projekt, dáme "Add", poté zvolíme "Class".

Přidání třídy do projektu

Dále potvrdíme, že chceme přidat třídu. Vyplníme pouze jméno třídy a klikneme na "Finish".

Pojmenování třídy

Vytvoří se nám dva nové soubory. V souboru Clovek.h bude deklarace, soubor Clovek.cpp je implementační a obsahuje implementace všech funkcí (později si řekneme, že se jim říká metody), které třída obsahuje.

Projekt po vytvoření třídy

Nyní pojďme vytvořit vše potřebné. Aktuální obsah souborů Clovek.cpp i Clovek.h můžete smazat a stačí, když do Clovek.h vložíte následující kód:

#include <string>
using namespace std;

class Clovek
{
public:
        int vek;
        string jmeno;
        string bydliste;
};

První dva řádky by nám už měli být jasné. Následuje vytvoření třídy (tedy toho "receptu", jak už bylo několikrát zmíněno). Klíčovým slovem class řekneme, že vytváříme třídu. Následuje jméno třídy a složené závorky, které určují tělo třídy. S dalším řádkem ("public:") si zatím nemusíte dělat starosti. Jedná se o modifikátor přístupu, který bude probrán později. Poté následují jednotlivé atributy třídy. Každý atribut je definován typem a jménem.

Výborně, máme tedy recept, ale jak vytvoříme onen "objekt"? Úplně jednoduše. Vytvořením třídy jsme současně vytvořili datový typ (jako je například int nebo chat). To také znamená, že se stejným způsobem bude i používat. Vytvoříme si soubor Source.cpp (jak jsme byli doteď zvyklí) a použijeme následující kód:

#include <iostream>
#include "Clovek.h"
using namespace std;

int main()
{
        Clovek pavel;
        pavel.jmeno = "Pavel";
        pavel.vek = 42;
        pavel.bydliste = "Praha";
        Clovek lukas;
        lukas.jmeno = "Lukas";
        lukas.vek = 26;
        lukas.bydliste = "Liberec";

        cout << pavel.jmeno << " bydli v " << pavel.bydliste << " a je mu " << pavel.vek << " let." << endl;
        cout << lukas.jmeno << " bydli v " << lukas.bydliste << " a je mu " << lukas.vek << " let." << endl;
        cin.get();
        return 0;
}

Nejdříve naincludujeme soubor Clovek.h. Proč se jednou používají ostré závorky a někdy uvozovky? Pokud použijeme ostré závorky, kompiler se bude snažit najít knihovnu ve vlastním seznamu. Většina kompilerů totiž přichází se standardníma knihovnama (jako je iostream, string apod.), které má uložené u sebe. Použijeme-li uvozovky, kompiler bude hledat relativně k místu, kde je umístěný soubor. V tomto případě tedy hledá soubor Clovek.h, který je ve stejné složce jako soubor Source.cpp. Pokud bychom napsali #include "tridy/Clovek.h", tak se kompiler nejdříve podívá do složky tridy, která musí být ve stejné složce jako Source.cpp. Až v této složce hledá soubor Clovek.h. Je důležité, abyste věděli, kde program získává závislosti. Jedná se o nejčastější problémy, začnete-li program psát do více souborů.

Pojďme ale pokračovat. Dále vytvoříme "objekt" typu Clovek. Až doteď jsme psal objekt vždy v uvozovkách. Bylo to záměrně. Jak bylo zmíněno, programovací jazyk objekt nezná. Máme tu třídu a od ní vytvořenou instanci. Správně bychom tedy měli říct, že vytváříme instanci lukas typu Clovek. Opět si neodpustím podotknout, že třída je pouze určitý recept, podle kterého se vytváří skutečná instance. Třída nijak do programu nezasahuje, vždy pracujeme jen s instancemi určité třídy.

Vypsání třídy

Příjde vám to povědomé? Ale jistě, vždyť to stejné jsme prováděli u struktur! Jak jsme ale pracovali se strukturami? Museli jsme mít skupinu funkcí, kde každá funkce přijímala strukturu v parametru. To u tříd není nutné, protože zavádí tzv. metody.

Metody

Metody nejsou nic jiného než funkce, ale jsou svázány s instancí třídy. To znamená, že nemůžeme zavolat metodu bez toho, aniž bychom měli již vytvořenou instanci. Tady tkví hlavní rozdíl mezi funkcemi a metodami. Funkce je samostatná a můžeme jit volat kdykoliv. Metodu můžeme volat pouze ve spojení s konkrétní instancí třídy.

Nejdříve si naši metodu vytvoříme. Budeme dodržovat pravidla, podle kterých by měla deklarace přijít do hlavičkového souboru, zatímco implementace do souboru implementačního. Není to podmínkou, ale umístíme-li implementaci do hlavičkového souboru, zaděláváme si na problémy během kompilaci. Více se tomu věnuji v článku o kompilaci. Nejdříve otevřeme souboru Clovek.h a vložíme do něj deklaraci metody.

#include <string>
using namespace std;

class Clovek
{
public:
        int vek;
        string jmeno;
        string bydliste;
        void pozdrav();
};

Nyní se přesuneme do implementačního souboru Clovek.cpp a funkci implementujeme. Protože je metoda vázaná na instanci určitého typu, musíme to u její implementaci zohlednit. Provádí se to názvem třídy, za kterým následují dvě dvojtečky. Tato konstrukce má speciální význam, ale bude probrána až později. Zatím napište do Clovek.cpp následující kód.

#include "Clovek.h"

void Clovek::pozdrav()
{
        cout << "Ahoj" << endl;
}

Nejdříve musíme includovat hlavičkový soubor třídy, následně se provádí samotná implementace. Nyní ještě upravíme funkci main, aby nás Pavel i Lukáš pozdravili.

cout << pavel.jmeno << " bydli v " << pavel.bydliste << " a je mu " << pavel.vek << " let." << endl;
cout << lukas.jmeno << " bydli v " << lukas.bydliste << " a je mu " << lukas.vek << " let." << endl;
lukas.pozdrav();
pavel.pozdrav();

Volání probíhá přes operátor tečky, jak jsme tomu zvyklí u atributů. Jediný rozdíl je v závorkách, které označují, že se má zavolat funkce. Výsledek si můžeme prohlédnut:

Použití metod v C++

Nyní příjde hlavní rozdíl mezi metodami a funkcemi. Funkce mohla přistupovat pouze ke globálním proměnným nebo k parametrům. To zůstává zachováno i pro metody, ale ty navíc mohou přistupovat k atributům instance. Zatím nám pouze řekli "Ahoj", ale my bychom chtěli, aby se představili. Clove.cpp změníme tak, aby výpis obsahoval i jméno člověka.

#include "Clovek.h"

void Clovek::pozdrav()
{
        cout << "Ahoj, jmenuji se " << jmeno << " a rad te vidim" << endl;
}

Vidíme, že můžeme použít proměnnou jmeno, která je ve skutečnosti atribut třídy.

Použití metod v C++

Pozn.: V C++ můžeme implementovat metody i pro struktury. Nicméně se to nedělá, protože struktury jsou v C++ spíše kvůli kompatibilitě s C. Céčko ovšem metody struktur nepovoluje, a tak by program nebyl kompatibilní.

Tím pro dnešní díl skončíme. Příště se podíváme na slibované modifikátory přístupu a konstrukci objektů.


 

Stáhnout

Staženo 1x (8.58 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

  Aktivity (4)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
Dočasná kategorie

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!