Szybki rachunek sumienia
Cała znajomość programowania jaką poznałeś do tej pory sprowadzała się do programowania strukturalnego. Wszystkie funkcje, które pisałeś do tej pory miały zasięg globalny, czyli były widoczne z każdego miejsca w projekcie, co mogło zacząć sprawiać trudności z zapewnieniem unikatowych nazw funkcji dla całego projektu, który pisałeś. Często pewnie zdarzały Ci się również sytuacje, w których tworzyłeś funkcje, do jakich przeciętny użytkownik nie powinien mieć dostępu. Jeśli miałeś takie problemy lub chcesz ich uniknąć w przyszłości rozdział ten pokaże Ci jak można w bardzo prosty sposób je rozwiązywać.
Definicja metody wewnątrz klasy
Pierwszą, a zarazem najprostszym sposobem na utworzenie metody w klasie jest napisanie jej wewnątrz klasy. Przykład:
class EksperymentCL
{
private:
int TwojaPrywatnaFunkcja( int a, int b )
{
return( a - b + 2 );
}
public:
int TwojaPublicznaFunkcja( int a, int b )
{
return(( a + b ) * 2 );
}
};
Metody, które zostały zadeklarowane jako publiczne, będą mogły być wywoływane spoza klasy. Metody prywatne mogą być wywołane tylko i wyłącznie wewnątrz klasy (we wszystkich metodach należących do klasy). Tworzenie metod prywatnych jest bardzo wygodne, ponieważ umożliwia nam dzielenie skomplikowanej, zazwyczaj publicznej metody na mniejsze elementy, które przy późniejszej analizie i nanoszeniu ewentualnych poprawek sprawia dużo mniej kłopotów niż modyfikacja jednego długiego kodu metody.
Definicja metody poza klasą
Pierwsza metoda, która została przedstawiona jest bardzo wygodna w użyciu, jednak ma takie same minusy jakie miały funkcje pisane w bloku głównym - kompilator nie widzi funkcji, które są 'wyżej'. Jeśli więc chcielibyśmy wywołać z metody TwojaPrywatnaFunkcja(), metodę TwojaPublicznaFunkcja () to kompilator wyrzuciłby nam błąd. Drugą wadą jest to, że czytelność kodu bardzo się obniża przez to, że nie widać czy dana funkcja należy do klasy czy też nie (nie wspominając o zmiennych). Aby temu zaradzić, ten sam kod co poprzednio można zapisać następująco:
class EksperymentCL
{
private:
int TwojaPrywatnaFunkcja( int a, int b );
public:
int TwojaPublicznaFunkcja( int a, int b );
};
int EksperymentCL::TwojaPrywatnaFunkcja( int a, int b )
{
return( a - b + 2 );
}
int EksperymentCL::TwojaPublicznaFunkcja( int a, int b )
{
return(( a + b ) * 2 );
}
Jak korzystać z metod będących wewnątrz klasy w praktyce
Aby skorzystać z metod, które są umieszczone wewnątrz klasy, musimy utworzyć sobie najpierw zmienną, a następnie za pomocą utworzonej zmiennej wywołujemy metodę klasy. Dla powyższego przykładu wyglądałoby to tak:
#include <iostream>
#include <conio.h>
using namespace std;
class EksperymentCL
{
private:
int TwojaPrywatnaFunkcja( int a, int b );
public:
int TwojaPublicznaFunkcja( int a, int b );
};
int EksperymentCL::TwojaPrywatnaFunkcja( int a, int b )
{
return( a - b + 2 );
}
int EksperymentCL::TwojaPublicznaFunkcja( int a, int b )
{
return(( a + b ) * 2 );
}
int main()
{
EksperymentCL zmienna;
cout << "Wynik: " << zmienna.TwojaPublicznaFunkcja( 3, 4 ) << endl;
getch();
return( 0 );
}
Zaprezentowany przykład jest niezbyt ciekawy, jednak pokazuje on jak działają klasy i funkcje w klasach oraz jak należy z nich korzystać.
Przykład
Poniższy przykład prezentuje praktyczne wykorzystywanie metod w klasach.
#include <iostream>
#include <iomanip>
#include <string>
#include <conio.h>
using namespace std;
class OsobaCL
{
protected:
string m_imie;
string m_nazwisko;
OsobaCL * m_nastepnaOsoba;
public:
void Inicjuj();
void Sprzatnij();
void Wypelnij();
OsobaCL * GetNastepnaOsoba();
void ShowDaneOsoby( int fImieWidth = 12, int fNazwiskoWidth = 20 );
void DodajOsobeNaKoniec();
};
void OsobaCL::Inicjuj()
{
m_nastepnaOsoba = NULL;
}
void OsobaCL::Sprzatnij()
{
if( m_nastepnaOsoba != NULL )
{
m_nastepnaOsoba->Sprzatnij();
delete m_nastepnaOsoba;
m_nastepnaOsoba = NULL;
}
}
OsobaCL * OsobaCL::GetNastepnaOsoba()
{
return( m_nastepnaOsoba );
}
void OsobaCL::Wypelnij()
{
cout << "Podaj imie: ";
cin >> m_imie;
cout << "Podaj nazwisko: ";
cin >> m_nazwisko;
}
void OsobaCL::ShowDaneOsoby( int fImieWidth, int fNazwiskoWidth )
{
cout << setw( fImieWidth ) << m_imie << " " << setw( fNazwiskoWidth ) << m_nazwisko << endl;
}
void OsobaCL::DodajOsobeNaKoniec()
{
OsobaCL * tOstatniaOsoba = this;
while( tOstatniaOsoba->m_nastepnaOsoba != NULL ) tOstatniaOsoba = tOstatniaOsoba->m_nastepnaOsoba;
OsobaCL * tNowaOsoba = new OsobaCL;
tNowaOsoba->Inicjuj();
tNowaOsoba->Wypelnij();
tOstatniaOsoba->m_nastepnaOsoba = tNowaOsoba;
}
int main()
{
OsobaCL * tPierwszaOsoba = new OsobaCL;
tPierwszaOsoba->Inicjuj();
tPierwszaOsoba->Wypelnij();
char tZnak;
do
{
cout << "Czy chcesz dodac nowa osobe? (T/N) ";
do
{
tZnak = getch();
} while(( tZnak != 'n' ) &&( tZnak != 'N' ) &&( tZnak != 't' ) &&( tZnak != 'T' ) );
cout << tZnak << endl;
if(( tZnak == 't' ) ||( tZnak == 'T' ) ) tPierwszaOsoba->DodajOsobeNaKoniec();
} while(( tZnak != 'n' ) &&( tZnak != 'N' ) );
OsobaCL * tWyswietlOsoby = tPierwszaOsoba;
while( tWyswietlOsoby != NULL )
{
tWyswietlOsoby->ShowDaneOsoby();
tWyswietlOsoby = tWyswietlOsoby->GetNastepnaOsoba();
}
tPierwszaOsoba->Sprzatnij();
delete tPierwszaOsoba;
getch();
return 0;
}