Serwis został przeniesiony pod nową domenę: http://cpp0x.pl/
PowrótPowrótHistoria odwiedzonych stron
Poprzednia lekcjaKurs C++Następna lekcja

XXX. Tworzenie funkcji w klasie

30.1. 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ć.

30.2. Deklaracja funkcji wewnątrz klasy

Pierwszą, a zarazem najprostszą metodą na utworzenie funkcji 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);
  }
};

Funkcje, które zostały zadeklarowane jako publiczne, będą mogły być wywoływane spoza klasy. Funkcje prywatne mogą być wywołane tylko i wyłącznie wewnątrz klasy (we wszystkich funkcjach należących do klasy). Tworzenie funkcji prywatnych jest bardzo wygodne, ponieważ umożliwia nam dzielenie skomplikowanej, zazwyczaj publicznej funkcji 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 funkcji.

30.3. Definicja funkcji wewnątrz klasy, deklaracja 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 funkcji TwojaPrywatnaFunkcja(), funkcję 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);
}

30.4. Jak korzystać z funkcji będących wewnątrz klasy w praktyce

Aby skorzystać z funkcji, które są umieszczone wewnątrz klasy, musimy utworzyć sobie najpierw zmienną, a następnie za pomocą utworzonej zmiennej wywołujemy funkcje 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ć.

30.5. Przykład

Poniższy przykład prezentuje praktyczne wykorzystywanie funkcji 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()
{
  //Szukanie ostatniej osoby
  OsobaCL* tOstatniaOsoba=this;//Zapisanie wskaźnika obecnej osoby do zmiennej
  while(tOstatniaOsoba->m_nastepnaOsoba!=NULL) tOstatniaOsoba=tOstatniaOsoba->m_nastepnaOsoba;

  //Utworzenie nowej osoby i zapisanie do ostatniej osoby
  OsobaCL* tNowaOsoba=new OsobaCL;
  tNowaOsoba->Inicjuj();
  tNowaOsoba->Wypelnij();
  tOstatniaOsoba->m_nastepnaOsoba=tNowaOsoba;
}

int main()
{
  /*Utworzenie pierwszej osoby*/
  OsobaCL* tPierwszaOsoba=new OsobaCL;
  tPierwszaOsoba->Inicjuj();

  /*Wypełnienie pierwszej osoby*/
  tPierwszaOsoba->Wypelnij();

  /*Wczytywanie kolejnych osób*/
  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();//Dodawanie nowej osoby
  }while((tZnak!='n')&&(tZnak!='N'));

  /*Wyświetlanie wszystkich osób*/
  OsobaCL* tWyswietlOsoby=tPierwszaOsoba;
  while(tWyswietlOsoby!=NULL)
  {
    tWyswietlOsoby->ShowDaneOsoby();
    tWyswietlOsoby=tWyswietlOsoby->GetNastepnaOsoba();
  }

  /*Zwalnianie pamięci*/
  tPierwszaOsoba->Sprzatnij();
  delete tPierwszaOsoba;

  getch();
  return(0);
}


Poprzednia lekcjaKurs C++Następna lekcja

Wszelkie prawa zastrzeżone. Autor: Piotr Szawdyński
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści bez wyraźnej zgody jego autora jest zabronione.


PowrótPowrótHistoria odwiedzonych stron
Panel Logowania
Login:
Hasło:

Użytkowników
Obecnie aktywnych:25
Zalogowanych:0
Zarejestrowanych:4367
Ostatnie 24h:736
Non-cookie 24h:2138
Wszystkich:214808
Ostatnia Aktualizacja
2010-09-01 19:27:34 (6 dni temu)
Ostatnio aktywni
fish134 godz
wiewiorka10 godz
Koni11 godz
BuZuz11 godz
Prezmen13 godz
trupank13 godz
szczgl15 godz
filipesq15 godz
KRIIS55117 godz
kuba181717 godz
extra218 godz
pixelmaster19 godz

Wynajem Sopot - wakacje
Pokój 2 osobowy 130zł/doba;
Lokalizacja: Sopot


O portaluArchiwumHistoriaIndeksRegulaminWyszukiwarkaLinki
Kurs HTML - strona WWW za darmoRestauracja "ATOL" - SopotValid HTML 4.01 TransitionalValid CSS!HTML CSS JavaScript FLASH PHP MySQL