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 vracet
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).