21
1 Članska funkcija U C-u (i ostalim proceduralnim jezicima) podaci i funkcije su u programu odvojeni Nije problem samo po sebi, osim u slučajevima koji su slični našem! Funkcije koje smo definirali za rad sa strukturom DinamickoPolje su tijesno povezane s tom strukturom Pitanje je kako dodatno naznačiti tu povezanost! Sintaksno – deklaraciju funkcije stavljamo unutar deklaracije strukture Time funkcija postaje član strukture Terminološka promjena Element strukture (varijabla deklarirana kao dio strukture) postaje članska varijabla strukture

Članska funkcija

  • Upload
    mckile

  • View
    63

  • Download
    3

Embed Size (px)

DESCRIPTION

Članska funkcija. U C-u (i ostalim proceduralnim jezicima) podaci i funkcije su u programu odvojeni Nije problem samo po sebi, osim u slučajevima koji su slični našem! Funkcije koje smo definirali za rad sa strukturom DinamickoPolje su tijesno povezane s tom strukturom - PowerPoint PPT Presentation

Citation preview

Page 1: Članska funkcija

1

Članska funkcija

U C-u (i ostalim proceduralnim jezicima) podaci i funkcije su u programu odvojeni

Nije problem samo po sebi, osim u slučajevima koji su slični našem! Funkcije koje smo definirali za rad sa strukturom

DinamickoPolje su tijesno povezane s tom strukturom Pitanje je kako dodatno naznačiti tu povezanost!

Sintaksno – deklaraciju funkcije stavljamo unutar deklaracije strukture Time funkcija postaje član strukture

Terminološka promjena Element strukture (varijabla deklarirana kao dio strukture)

postaje članska varijabla strukture

Page 2: Članska funkcija

2

Primjer članske funkcije

int main(int argc, char* argv[]) {

StrukturaC objC;Funkcija (&objC);

StrukturaCPP objCPP;objCPP.Funkcija();

return 0;}

struct StrukturaC { int NekiPodatak;};void Funkcija(StrukturaC *s){};

struct StrukturaCPP { int NekiPodatak; void Funkcija() {}};

Page 3: Članska funkcija

3

Struktura proširenačlanskim funkcijamastruct DinamickoPolje{// Članske funkcije

int Inicijaliziraj(int inMaxBrojElem);void Izbrisi();int PostaviNovuVelicinu(int NoviBrojElem);

void PostaviElement(int Indeks, int Vrijednost);int DohvatiElement(int Indeks);int DodajElementNaKraj(int Vrijednost);

int BrojElemenata();

// Članske varijableint *_Podaci;

int _BrojElem; // koliko stvarno ima elemenata u poljuint _MaxBrojElemenata; // maksimalni raspoloživi prostor

};

Page 4: Članska funkcija

4

S članskim funkcijama

Podaci P04_DinamickoPolje_Cpp1_clanske_funkcije Pokreni program

P03

Page 5: Članska funkcija

5

Obična i članska funkcijaint Inicijaliziraj(struct DinamickoPolje

*Polje, int MaxBrojElem){

Polje->BrojElem = 0;Polje->MaxBrojElemenata = MaxBrojElem;

Polje->Podaci = (int *) malloc(MaxBrojElem * sizeof(int));

if( Polje->Podaci == NULL )return 1;

elsereturn 0;

}

int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem)

{// Implicitno korištenje this_BrojElem = 0;_MaxBrojElemenata = inMaxBrojElem;

// ili eksplicitnothis->_BrojElem = 0;this->_MaxBrojElemenata = inMaxBrojElem;

_Podaci = (int *) malloc(_MaxBrojElemenata * sizeof(int));

if( _Podaci == NULL )return 1;

elsereturn 0;

}

Page 6: Članska funkcija

6

Klasa (class) – Struktura (struct)

(vrijedi samo za C++)

Klasa (class) i struktura (struct) – ista funkcionalnost.

Jedina razlika: članovi u klasi su po defaultu privatni; članovi u strukturi su po defaultu javni

Page 7: Članska funkcija

7

Operator dosega :: (1.put)

Koristi se za definiranje člana klase izvan deklaracije klase.

int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem){

this->_BrojElem = 0;this->_MaxBrojElemenata = inMaxBrojElem;

_Podaci = (int *) malloc(_MaxBrojElemenata * sizeof(int));

if( _Podaci == NULL ) return 1; else return 0;}

Page 8: Članska funkcija

8

Prednosti korištenja članskih funkcija

Riješili smo nezgrapnost stalnog prenošenja pokazivača na strukturu kao parametra Doduše, “problem” je samo prividno riješen – ipak

se mora naznačiti za koju varijablu (instancu strukture) se poziva funkcija

Riješili smo problem sukoba imena Možemo imati funkcije istog imena, sve dok su

one elementi različitih struktura

Page 9: Članska funkcija

9

Prednosti korištenja članskih funkcija (2)

Poziv funkcija koje su dio strukture se po sintaksi jasno razlikuju od poziva običnih funkcija:

instancaStrukture.imeFunkcije(parametri)

Funkcije koje djeluju nad podacima u strukturi imaju izravnu vezu s konceptom strukture budući da su njen sastavni dio

Page 10: Članska funkcija

10

Kamo je nestao pokazivačDinamickoPolje * ? Kako pozvana funkcija zna za koju je varijablu strukture pozvana ? Funkciji se implicitno prenosi pokazivač this

this je pokazivač koji pokazuje na varijablu strukture za koju je članska funkcija pozvana

“lokalna varijabla” za čiju se “deklaraciju” i inicijalizaciju brine prevoditelj (compiler)

int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem) {// implicitno korištenje this_BrojElem = 0;

// ili eksplicitnothis->_BrojElem = 0;...

}

Page 11: Članska funkcija

11

Operator dosega (2.put)

int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem) { ... }

:: = scope resolution operator (operator određivanja dosega)

U C++ : scope (doseg) = mjera vidljivosti identifikatora (varijable, funkcije, klase) u programu

U našem primjeru je bitan jer njime kod implementacije funkcije Inicijaliziraj (a i svake druge članske funkcije) naznačavamo njenu pripadnost klasi DinamickoPolje

Page 12: Članska funkcija

12

Preostali problemi

I dalje imamo problem mogućeg izravnog mijenjanja sadržaja varijabli u strukturi Utječe na kasnije ponašanje članskih funkcija

(najčešće s nedefiniranim posljedicama!) Rješava se uvođenjem prava pristupa

Korištenjem ključnih riječi private i public graditelj strukture može odrediti koji njen dio će biti dostupan svima, a koji dio će biti dostupan samo članskim funkcijama strukture

Page 13: Članska funkcija

13

Javni dostupni i privatni dijelovi strukture

struct PrimjerStrukture {

public:int _JavnoDostupnaVarijabla;

void JavnoDostupnaClanskaFunkcija(int Parametar);

private:int _PrivatnaVarijabla;

float PrivatnaClanskaFunkcija();

};

Page 14: Članska funkcija

14

Može se ograničiti skup mjesta (lokacija) u programu s kojih se može pristupiti privatnim dijelovima strukture

Primjer “pristupa”:

PrimjerStrukture var; var._PrivatnaVarijabla = 0;

Prevoditelj (compiler) će kod prevođenja programa javiti pogrešku!

struct PrimjerStrukture {public:int _JavnoDostupnaVarijabla;void JavnoDostupnaClanskaFunkcija(int Parametar);private:int _PrivatnaVarijabla;float PrivatnaClanskaFunkcija();};

Page 15: Članska funkcija

15

class DinamickoPolje{public:

int Inicijaliziraj(int inMaxBrojElem);void Izbrisi();int PostaviNovuVelicinu(int NoviBrojElem);

void PostaviElement(int Indeks, int Vrijednost);int DohvatiElement(int Indeks);int DodajElementNaKraj(int Vrijednost);

int BrojElemenata();

private:int *_Podaci;

int_BrojElem; // koliko stvarno ima elemenata u poljuint MaxBrojElemenata; // koliki je maksimalni raspolozivi prostor

};

Page 16: Članska funkcija

16

Privatnim dijelovima strukture se može pristupiti samo unutar definicije (tijela) članske funkcije

I članske funkcije mogu biti privatne! Napomena:

Postoji i protected pravo pristupa Važno je kod uspostavljanja hijerarhije struktura

putem nasljeđivanja

Page 17: Članska funkcija

17

U sljedećem nastavku...

Konačno – klase !

Page 18: Članska funkcija

18

Klasa Uvodimo ključnu riječ class

Klasa poopćava pojam strukture iz C-a Koja je razlika ?

Sa stanovišta C++ prevodioca primarno sintaksna – kod strukture je sve podrazumijevano public dok je kod razreda sve podrazumijevano private

Konceptualna razlika: Struktura je (ipak) namijenjena modeliranju skupa jednostavnih

podataka nad kojima ostali dijelovi programa direktno operiraju Razred kao primarni koncept OO paradigme (prisutan u svim OO

jezicima!) je namijenjen modeliranju (predstavljanju) koncepata iz područja problema koji rješavamo (DinamickoPolje, Stog, HashFile, ...) koji imaju složeno ponašanje realizirano preko skupa članskih funkcija

Primjer: P05_DinamickoPolje_Cpp2_prava_pristupa

Page 19: Članska funkcija

19

Malo teorije

Dva osnovna elementa OO paradigme: apstrakcija i enkapsulacija (učahurivanje)

Apstrakcija – razredi / objekti predstavljaju koncepte iz domene problema koji rješavamo Razred DinamickoPolje je apstrakcija koncepta dinamičkog polja s dobro

definiranim karakteristikama Nije li to isto i struktura u C-u?

Struktura predstavlja agregatni skup podataka nad kojima operiraju “vanjski” elementi programa (funkcije)

Vanjske funkcije nisu dio strukture – zbog toga struktura nije “potpuna” jer je za razumijevanje koncepta koji predstavlja potrebno proučiti nešto što nije dio same definicije strukture

Struktura nije “zatvorena” u smislu da ne upravlja sama svojim ponašanjem i stanjem!

Modeliranjem koncepta pomoću razreda rješavamo navedene probleme

Page 20: Članska funkcija

20

Enkapsulacija – “niti jedan dio složenog sustava ne bi smio ovisiti o unutrašnjim detaljima drugog dijela” “unutrašnji detalji” – korisnika razreda DinamickoPolje uopće ne bi

trebalo zanimati kako je realizirana njegova funkcionalnost Napomena: koncept dinamičkog polja je vrlo jednostavan i praktički implicira

način implementacije (dinamička alokacija memorije za elemente polja), ali kod složenijih razreda to ni u kojem slučaju nije tako! Čak i kod dinamičkog polja možemo imati varijabilnost u implementaciji Npr., ako je rukovanje memorijom “skriveno” od korisnika razreda, može se izgraditi

vlastiti memory-manager (ne koristimo malloc i realloc, već vlastitu implementaciju – npr. radi efikasnosti)

Enkapsulaciju postižemo deklariranjem unutrašnjih detalja razreda kao private Budući da tada ionako ne može pristupiti tim dijelovima, korisnik razreda DinamickoPolje ne može o njima ni ovisiti (zato jer ih ne može izravno referencirati u programskom kodu koji on piše)

Page 21: Članska funkcija

21

Javno sučelje razreda

Sve što je u razredu deklarirano kao public dio je javnog sučelja razreda

Javno sučelje razreda predstavlja “prozor u svijet” kroz koji razred komunicira s ostalim dijelovima programa Definiranjem članskih varijabli kao private, razred “skriva” svoje stanje

Primjer enkapsulacije u stvarnom životu: DVD player – javno sučelje čini par kabela i daljinski upravljač

“Običnog” korisnika u biti ne zanima kako DVD player radi sve dok on ispravno reagira na “poruke” zadane preko sučelja (Play, Stop, Eject, ... )

Slično vrijedi i za razrede Za korisnika razreda DinamickoPolje je bitno da razred ima očekivano

ponašanje, a kako je unutar razreda omogućeno takvo ponašanje, korisnika (uglavnom) ne zanima!