Retezec krok 1 - Návrh třídy a její deklarace

 

V kroku 1 až 3 vytvoříme třídu Retezec, která dokáže uložit znaky řetězce a vytvoříme jednoduchý prográmek, ve kterém budeme třídu testovat. Můžete použít libovolný překladač jazyka C++, ja budu popisovat postup ve Visual C++ 1.0, který ještě umožňuje vytvářet programy pro MS-DOS -Tedy zkušební prográmek bude pro DOS !!!
Také se dozvíte něco o
konstruktorech a destruktorech a zopakujeme si co je public a protected.

Deklarace třídy Retezec
Pro jednoduchost nebudeme používat dynamickou alokaci paměti, řekněme si tedy, že max. délka řetězce bude 255 znaků. Pro pozdější snadné použití nové třídy si pro ni vyhradíme vlastní soubory RETEZ.CPP a RETEZ.H. Začneme deklarací třídy v souboru RETEZ.H

Otevřete nový soubor a napište si nějakou hlavičku:


//RETEZ.H -deklarace třídy Retez pro práci s textovými řetězci
// 4.10.1998 Jan Dolinay


Přidejte definici konstanty pro maximální počet znaků řetězce:


#define MAX_DELKA 255

A deklarujte třídu Retezec takto:

class Retezec
{
public:
Retezec(); //konstruktory
Retezec(char* text);
char* GetText();

protected:
char m_text[MAX_DELKA + 1]; //zde bude textový řetězec
int m_delka; //aktuální délka řetězce
};


Uložte soubor pod názvem RETEZ.H

Narazili jsme na první neznámý pojem - konstruktor. Konstruktor je vlastně členská funkce, která je zvláštní tím , že nese stejné jméno jako třída, tj zde Retezec. Tato funkce je volána pokaždé když se vytváří objekt dané třídy, tj. když ve vašem programu napíšete: Retezec mujRetez; Konstruktor je tedy to pravé místo pro počáteční inicializaci členských proměnných naší třídy.
Třída Retezec deklaruje dva konstruktory. Jeden nebere žádné parametry a jeho hlavním účelem je umožnit nám vytvořit prázdný řetězec, což
se provede takto: Retezec nasNovyPrazdnyRetezec;
Druhý konstruktor naproti tomu umožňuje vytvořit řetězec přímo s určitým obsahem:
Retezec NasNovyRetezecSTextem("ahoj kamo");

S konstruktorem souvysý pojem destruktor. Destruktor je opak konstruktoru. Má také jméno třídy, pouze s jedním znakem navíc.
~Retezec(); //takto by vypadala deklarace destruktoru pro naši třídu

Destruktor je volán, když objekt dané třídy zaniká, např. po skončení programu. Naše třída žetězec nealokuje žádnou paměť dynamicky, nemusí tedy nic mazat a tak můžeme starost s destruktorem ponechat překladači. Pokud budete ve své třídě alokovat dynamicky paměť, měli byste destruktor použít.

Ve Třídě řetězec jsme deklarovali také členskou funkci GetText(). Funkce bude vrac
et ukazatel na text uložený v členské proměnné m_text (definované takto char m_text[256]; ). Tato proměnná je totiž protected a to znamená, že k ní není možno přistupovat zvenku. Při pokusu o výpis řetězce tímto stylem: printf("retezec: %s", naseTrida.m_text); by se vám od kompilátor vysmál asi takto: "Cannot acces protected member of class Retezec" .
Správný výpis bude vypadat takto: printf("retezec: %s", naseTrida.Gettext());
Je dobrým zvykem deklarovat členské proměnné jako protected a umožnit k nim přístup z venku pouze přes
public členské funkce. Pozn. Nemůsíte to samozřejmně dělat pro každou -píp- proměnnou, ale u těch klíčových je to celkem vhodný způsob jak zabránit nechtěným změnám. Vaše členské funkce totiž vědí -nebo by alespoň měli-jak zacházet se svými členskými proměnnými, ale ty potvory tam venku to vědět nebudou a mohli by nadělat víc škody než užitku.

Dalším dobrým zvykem je pojmenovávat členské proměnné tak, aby začínali m_… (m jako member = člen).

V dalším kroku přidáme definici členských funkcí.