Programatorii Club - - materiale de pe Delfi și - arhiva blogului - Lectia 28

După cum știți deja, programul poate accesa private (private) membrii clasei numai cu elemente funcționale din aceeași clasă. Folosind un membrii clasei privat, în loc de general, în toate situațiile în care este posibil, va reduce posibilitatea programului de a strica valoarea membrilor clasei, ca programul ar putea include elemente numai prin funcțiile de interfață (care de control al accesului la elementele particulare). Cu toate acestea, în funcție de utilizarea obiectelor în programul dumneavoastră, uneori, puteți crește în mod semnificativ performanța permițând o clasă pentru a avea acces direct elementele private ale celuilalt. În acest caz, costurile reduse (rulare este necesar) pentru a apela funcțiile de interfață. În aceste C ++ situații pentru a determina clasa ca prieten (prieten> de o altă clasă și permite accesul clasa altele la elementele particulare ale unei clase diferite. In acest tutorial explica modul în care programul poate indica faptul că cele două clase sunt prieteni. La sfârșitul acestei lecții, vă maestru următoarele concepte de bază:

  • Utilizarea de cuvinte cheie E prietenul, clasa poate spune C ++, care este prietenul lui, t. E. Cu alte cuvinte, că alte clase pot aplica direct la elementele sale private.
  • membrii clasei private pentru a proteja clasa de date, astfel încât trebuie să se limiteze domeniul de aplicare al clasei-prieteni doar acele clase care au nevoie într-adevăr acces direct la elementele particulare ale clasei dorite.
  • C ++ vă permite să restricționeze accesul la un anumit set de funcții ușor de utilizat.

Elementele private (private) vă permit să protejeze clase și de a reduce riscul de erori. Prin urmare, ar trebui să limiteze utilizarea de clasă prieteni cât mai mult posibil. Uneori, programul poate schimba în mod direct valorile unei clase de elemente, crește probabilitatea de erori.

DETERMINAREA PRIETENI CLASA

C ++ permite prieteni dintr-o anumită clasă de acces privat membri ai acelei clase. Pentru a specifica o C ++, că o clasă este un prieten (prieten) din altă clasă, pur și simplu plasați cuvântul cheie al clasei corespunzătoare, un alt prieten și un nume în interiorul definiției unei alte clase. De exemplu, această clasă de carte declară un prieten bibliotecar clasă. Prin urmare, clasa obiecte bibliotecari pot accesa direct elementele private ale unei cărți de clasă, folosind operatorul punct:

publice:
carte (char *, char *, char *);
void show_book (void);
prieten bibliotecar;
privat:
char titlu [64];
autor char [64];
catalog char [64];
>;

După cum puteți vedea, pentru a indica alte nevoi doar o singură declarație în interiorul unei definiții de clasă. De exemplu, următorul program utilizează VIEWBOOK.CPP bibliotecar ca o altă carte de clasă. În consecință, funcțiile de bibliotecari de clasă pot accesa direct elementele private ale unei cărți de clasă. În acest caz, programul utilizează funcția de clasa bibliotecarul change_catalog pentru a schimba numărul de catalog de card pentru o anumită carte:

publice:
carte (char *, char *, char *);
void show_book (void);
prieten bibliotecar;
privat:
char titlu [64];
autor char [64];
catalog char [64];
>;

carte :: carte (char * titlu, char * autor, char • catalog)

strcpy (carte :: titlu, titlu);
strcpy (carte :: autor, autor);
strcpy (carte :: catalog, catalog);
>

publice:
void change_catalog (carte *, char *);
char * get_catalog (carte);
>;

void bibliotecar :: change_catalog (carte * this_book, char new_catalog *)

char * bibliotecar. get__catalog (carte this_book)

catalog static char [64];
strcpy (catalog, this_book.catalog);
întoarce (catalog);
>

programare carte ( «program de învățare în limbajul C ++», «Jamsa», «P101»);
bibliotecă bibliotecar;
programming.show_book ();
library.change_catalog (programare, «Lumina C ++ 101" );
programming.show_book ();
>

De obicei, singura modalitate prin care programul poate avea acces la elementele private ale unei clase, este de a utiliza funcțiile de interfață. În funcție de obiectele program de aplicație poate fi uneori convenabil (sau mai eficiente în ceea ce privește viteza de calcul) pentru a permite o clasă pentru a avea acces la elementele particulare ale celuilalt. Pentru a face acest lucru, trebuie să vă informeze ++ compilator C, că clasa este un prieten (prieten). Compilatorul, la rândul său, permite altor clase de a avea acces la elementele particulare ale clasei. Pentru a declara o clasă de un prieten, a pus prietenul cuvinte cheie și numele clasei-prieten în secțiunea publică a definiției de clasă, așa cum se arată mai jos:

Ca prieteni diferă de elementele protejate (protejate)

De la lecția 26, ați învățat elemente care în C ++, sunt protejate (protejate) ale clasei care permite claselor derivate pentru a accesa membrii clasei de bază direct protejate, folosind operatorul punct. Amintiți-vă că elementele clasei protejate pot avea acces numai acele clase care sunt derivate din această clasă de bază, cu alte cuvinte, clasele care moștenesc din membrii clasei de bază (elemente ale clasei protejate sunt ca privat la restul programului). Clasele C ++ prieteni de obicei, nu sunt legate prin legături de succesiune. Singurul mod pentru astfel de clase fără legătură cu accesul la elementele particulare ale unei alte clase este de a prezenta altă clasă a informat compilatorului că această clasă este un prieten.

LIMITARE numărul de prieteni

După cum tocmai ați învățat, dacă declarați un prieten clasă de o altă clasă, vă oferă un acces de clasă prieten la elemente de date private ale altei clase. Știi, de asemenea, că mai mult accesul la datele private a clasei, cu atât mai probabil să facă greșeli în program. Prin urmare, în cazul în care accesul la datele private ale unei alte clase necesită doar câteva funcții ale clasei, C ++ vă permite să specificați că numai anumite funcții ușor de folosit ale clasei vor avea acces la elementele private. De exemplu, să presupunem că clasa bibliotecar reprezentat în programul precedent, conține o mulțime de funcții diferite. Cu toate acestea, să presupunem că numai funcțiile change_catalog get_catalog și au nevoie de acces la elementele particulare ale unei cărți de clasă. În interiorul cărții definiție de clasă, putem restricționa accesul la elementele particulare ale doar două funcții, după cum se arată mai jos:

publice:
carte (char *, char *, char *);
void show_book (void);
prieten char * bibliotecar :: get_catalog (carte);
prietenul nule bibliotecar. change_catalog (carte *, char *);
privat:
char titlu [64];
autor char [64];
catalog char [64];
>;

După cum puteți vedea, prieten declarația E conține prototipuri completă a tuturor funcțiilor prietenoase care pot accesa direct elementele private.

funcționa doar elementele enumerate ca prieteni, pot accesa direct elementele private ale unei clase folosind operatorul punct.

În cazul în care programul dumneavoastră începe să se refere la o clasă la alta, puteți obține o eroare de sintaxă în cazul în care ordinea definițiilor de clasă este incorectă. În acest caz, cartea definiție de clasă utilizează prototipuri funcționale definite în clasa bibliotecarul. Prin urmare, clasa de definiție bibliotecar ar trebui să preceadă clasa definiție carte. Cu toate acestea, dacă analizați bibliotecarul de clasă, veți găsi că aceasta se referă la clasa de carte:

publice:
void change_catalog (carte *, char *);
char * get_catalog (carte);
>;

Pentru că nu se poate pune definiția de carte de clasă înainte de definirea bibliotecarului clasa, C ++ vă permite să declare o carte de clasă, informându-se astfel compilatorul că această clasă este, și apoi defini. Următoarele arată cum se face:

Programul următor folosește funcții prietenoase pentru LIMITFRI.CPP bibliotecar clasa a restricționa accesul la datele private ale unei cărți de clasă. Observați ordinea definițiilor de clasă:

publice:
void change_catalog (carte *, char *);
char * get_catalog (carte);
>;

publice:
carte (char *, char *, char *);
void show_book (void);
prieten char * bibliotecar :: get_catalog (carte);
prieten void bibliotecar :: change_catalog (carte *, char *);
privat:
char titlu [64];
autor char [64];
catalog char [64];
>;

carte :: carte (char * titlu, char * autor, char * catalog)

strcpy (carte :: titlu, titlu);
strcpy (carte :: autor, autor);
strcpy (carte :: catalog, catalog);
>

void bibliotecar :: change_catalog (carte * this_book, char new_catalog *)

char * bibliotecar :: get_catalog (carte this_book)

catalog static char [64];
strcpy (catalog, this_book.catalog);
întoarce (catalog);
>

programare carte ( «program de învățare în C ++», «Jamsa», «P101»);
bibliotecă bibliotecar;
programming.show_book ();
library.change_catalog (programare, «Lumina C ++ 101" );
programming.show_book ();
>

Care este identificatorul de clasă

Această linie spune compilatorului că programul va determina mai târziu clasa specificată, atâta timp cât programul este permis să se refere la această clasă.

CE TREBUIE SĂ ȘTIȚI

În această lecție ați învățat cum să folosească claselor prieteni pentru a avea acces la elementele particulare ale unei alte clase utilizându-se în mod direct operatorul punct. În lecția 29 vă va învăța cum să utilizați C ++ template-uri de funcții pentru a simplifica definirea unor astfel de funcții. Dar, înainte de a trece la lecția 29, asigurați-vă că ați însușit următoarele:

articol aleatoriu