XXV. Diel C++ - Hlavičkové súbory III. – vytvorme si vlastný

Michal Kyžňanský  /  21. 04. 2006, 00:00

V tomto pokračovaní seriálu o programovaní v jazyku C++ si povieme ako sprehľadniť tvorbu programov a oddeliť funkcie, alebo šablóny premenných do samostatného hlavičkového súboru. Vytvorme si teda vlastný hlavičkový súbor!

Pri práci s jazykom C++ sa používajú hlavičkové súbory. Hlavičkové súbory majú príponu .h a obsahujú predefinované funkcie a konštanty, ako sme si to ukazovali na príklade hlavičkového súboru math.h a time.h. Vytvorením vlastných hlavičkových súborov si môžeme uľahčiť prácu pri ďalšom programe, kde by sme chceli použiť rovnakú funkciu, ktorú sme vlastnoručne vytvorili a sme na ňu pyšný. To však nie je jediné použitie. Pri skutočnom programovaní sa všetok kód nepíše do jedného .cpp súboru, ale sa delí do hlavičkových súborov a do knižníc. Je to dôležité kvôli prehľadnosti a opätovnému použitiu.

Pre tvorbu hlavičkových súborov stačí vytvoriť textový súbor v adresári s projektom a uložiť ho s príponou .h, alebo použijeme priamo v C++ Builderi možnosť File->New->Other a v záložke New vyberte možnosť Header file. Otvorí sa nové okno, kde nie je nič a môžeme začať s tvorbou vlastného hlavičkového súboru.

 

Príkazy v hlavičkovom súbore


Pri tvorbe využijeme trojicu príkazov, ktoré sme ešte nespomínali.

#ifndef a #endif – sú to dva príkazy, medzi ktoré sa píše všetko, čo chceme aby náš vytvorený hlavičkový súbor obsahoval. Príkaz #ifndef znamená if not defined – čo v preklade značí, ak nie je definované. To znamená, že ak chceme vkladať hlavičkový súbor a v ňom už nie je zaznamenané žiadne jeho vloženie, alebo ešte nebol vložený ani definovaný príkazom #define tak sa vykonajú príkazy zatvorené medzi ním a definíciou #endif. Ak je v tom hlavičkovom súbore volané znovu vloženie toho istého hlavičkového súboru, tak sa už nevolá dvakrát vďaka príkazu #define, ale začne pracovať s kódom po definícii #endif.

#define - má v normálnych programoch odlišné použitie ako v hlavičkových súboroch. Tento príkaz slúži na definovanie vlastných konštánt. Jednoduchý príklad:
#define max_cena_procesor 8765  

V hlavičkovom súbore slúži tento príkaz ako definovanie mena hlavičkového súboru a vykonáva to, čo je spomínané v odstavci o príkazoch #ifndef a #endif

Najprv si vytvoríme jednoduchý hlavičkový súbor, ktorý bude obsahovať definície niekoľkých výpočtových funkcii a jednu konštantu.
//hlavičkový súbor hlava.h 
#ifndef _HLAVA_H_
#define _HLAVA_H_


#define max 1000.0

double sucet(double a,double b)
{
return (a + b);
}

void viacako(double a)
{
if(a > max){
ShowMessage("Je to príliš veľa");
}
else{
ShowMessage("Číslo je v danom rozmedzí");
}
}

int podiel(double a,double b)
{
return (a/b);
}

int sucin(double a,double b)
{
return (a*b);
}

#endif

Hlavičkový súbor máme hotový, a teraz ho chceme použiť v programe. Ako na to? Určite viete, že vkladanie hlavičkových súborov v C++ funguje pomocou príkazu #include. Ale zatiaľ, čo sme vkladali všetky hlavičkové súbory, tak sme ich dávali do zátvoriek <> ako napríklad #include <math.h>. Týmto typom zátvoriek vravíme programu, že má tento hlavičkový súbor hľadať v zložke Include, kde sú umiestnené všetky hlavičkové súbory po inštalácii C++ Buildera. Ale poznáme ešte jeden spôsob vkladania pomocou úvodzoviek - #include "hlava.h". Tento spôsob vkladania pomocou úvodzoviek vraví programu, že hlavičkový súbor je umiestnený v zložke, kde je uložený náš projekt, na ktorom pracujeme. Vytvoríme si program, ktorý bude obsahovať 4 komponenty Button. Pomocou tlačítok budeme volať a používať funkcie z nášho hlavičkového súboru.

Príklad programu:
//---------------------------------------------------------- 
#include #pragma hdrstop
#include "hlava.h"
#include "Unit1.h"

//----------------------------------------------------------
#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;
//----------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//-----------------------------------------------------------

void __fastcall TForm1::sucet_butClick(TObject *Sender)
{
ShowMessage(sucet(231.4,547.2));
}
//------------------------------------------------------------

void __fastcall TForm1::podiel_butClick(TObject *Sender)
{
ShowMessage(podiel(25,5));
}
//-------------------------------------------------------------

void __fastcall TForm1::sucin_butClick(TObject *Sender)
{
ShowMessage(sucin(5,8));
}
//-------------------------------------------------------------

void __fastcall TForm1::viacako_butClick(TObject *Sender)
{
viacako(324);
}

//-------------------------------------------------------------

Teraz si ukážeme jeden spôsob, ako rozdeliť časti zdrojového kódu do viacerých súborov. Tento krát do toho zapojíme aj .cpp súbor. Vytvoríme si triedu obchod v hlavičkovom súbore hlava2.h. Vložíme do nej metódy, ale iba ich tam deklarujeme. Telo týchto metód bude uložené v súbore hlava2.cpp. takto to bude vyzerať po dokončení.

Súbor hlava2.h:
#ifndef _HLAVA2_H_ 
#define _HLAVA2_H_


class obchod{

public:

//definované sú iba deklarácie funkcii

double rataj(double a, double b);
void nakup(double chlieb,double syr);
};

#endif


Súbor hlava2.cpp:
#include "hlava2.h"	//použijú sa dáta z hlav. súboru   

double obchod::rataj(double a, double b)
{
return (a + b)- 0.19 *(a + b);
}

void obchod::nakup(double chlieb,double syr)
{
if ((chlieb + syr) > 1500){
ShowMessage("Nakúpili ste kvalitne");
}

else{
ShowMessage("Preco šetríte?");
}

}


Hlavný súbor – Unit1.cpp
//-------------------------------------------------------------  
#include #pragma hdrstop
#include "hlava2.cpp"
//vloženie súboru hlava2.cpp
#include "Unit1.h"

//--------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm" TForm1 *Form1;

//--------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
obchod moj;
ShowMessage(moj.rataj(5410,2154)); //výpisy funkcii
moj.nakup(124,256);
}
//---------------------------------------------------

Hore uvedený príklad krásne ilustruje, ako možno volať súbor, ktorý volá ešte iný. V hlavnom súbore Unit1.cpp je volaný súbor hlava2.cpp. Ten obsahuje metódy triedy obchod deklarovanej v hlavičkovom súbore hlava2.h. Súbor hlava2.cpp obsahuje volanie hlavičkového súboru takže je všetko pekne prepojené. Hlavičkové súbory a delenie programu do viacerých častí je dôležitou súčasťou programovania, pretože už pri vložení viac ako 5-6 funkcii do hlavného programu sa môže stať, že na druhý deň sa už nevyznáte vo vašom programe. Pre programátora je 2. najväčšou nočnou morou, keď nespoznáva vlastný program.

V budúcom dieli si povieme o stdio.h a o jeho funkciách. Potom si urobíme prestávku s hlavičkovými súbormi a jeden diel bude venovaný zaujímavým riešeniam programov a rôznym úlohám.

Súvisiace články:

Prehľad všetkých dielov

Neprehliadnite: