laborator 5 poo
DESCRIPTION
pooTRANSCRIPT
Laboratorul 5. Clase și funcții prietene
O funcție este prietenă (friend) cu o clasă dacă are acces la datele membru private ale
acelei clase. O funcție prietenă poate fi o funcție globală sau chiar o funcție membru a altei
clase.
O clasă este prietenă cu o altă clasă dacă are acces la datele membru ale acesteia.
O funcție, respectiv o clasă prietenă se declară utilizând cuvântul friend astfel:
1. friend tip_funcție nume_funcție (Lista_parametri_formali); // funcție friend globală
2. friend tip_funcție nume_clasă :: nume_functie (Lista_parametrii_formali); // funcție
friend membru
3. friend nume_clasa;
Exemplu 1.
#include <iostream> #include <conio.h> using namespace std; class A { public: // se declara clasa B ca fiind clasa prietena a clasei A friend class B; // declararea functiei g_print_m ca si functie prietena cu clasa A friend void g_afiseaza_m(); private: int m; }; class B { public: void afiseaza_m() { A a; a.m = 255; cout << "clasa B este prietena cu clasa A" << endl << " poate accesa membrul privat A::m" << endl << a.m << endl; } }; void g_afiseaza_m() { A a; a.m = 300; cout << "functia g_afiseaza_m nu este un membru a clasei A dar este prieten" << endl << "poate accesa membrul privat A::m " << endl << a.m << endl; } int main() {
B b; b.afiseaza_m(); g_afiseaza_m(); getch(); return 0; }
Exemplu 2.
#include<iostream> #include<conio.h> using namespace std; class nod{ int info; nod* urm; public: void adaugare(nod*&, int); void listare(nod*); friend void sterg(nod*, int); }; nod *v, *sf; void nod::adaugare(nod*& v, int val) { nod* c; if (!v) { v=new nod; v->info=val; v->urm=0; sf=v; } else { c=new nod; sf->urm=c; c->info=val; c->urm=0; sf=c; } } void nod::listare(nod* v) { nod* c=v; while (c) { cout<<c->info<<" "; c=c->urm; } cout<<endl; } void sterg(nod * v, int val) { nod *c, *man;
if (v->info==val) { man=v; v=v->urm; } else { c=v; while (c->urm->info!=val) c=c->urm; man=c->urm; c->urm=man->urm; if (man==sf) sf=c; } delete man; } void main() { int i; nod lista; for (i=1; i<=10; i++) lista.adaugare(v,i); lista.listare(v); sterg(v,2); lista.listare(v); getch(); }
Liste
Inserare la început
p->urm=prim;
prim=p;
Inserarea la sfârsit
p->urm=NULL;
if(prim==NULL )
prim=p;
else
{
q=prim;
while(q->urm!=NULL)
q=q->urm;
q->urm=p;
}
Inserarea ordonata a unui nod într-o lista
if(prim==NULL)
return p; /*inserarea primului nod*/
else
if(strcmp(prim->nume,p->nume)>0)
{
p->urm=prim;/* inserare inainte de primul nod*/
return p;
}
else
{
q=prim;
while(q->urm!=NULL && strcmp(q->urm->nume,p->nume)<0)
q=q->urm;
p->urm=q->urm;/*inserare pe parcurs sau la sfarsit*/
q->urm=p;
return prim;
}
Stergerea unui nod din lista
nod* stergere(nod *prim,char *nume){
nod *q,*p;
if(prim!=NULL) /*daca lista nu este vida*/
{
if(strcmp(prim->nume,nume)==0)
{
q=prim;
prim=prim->urm; /*stergerea primului nod*/
delete q;
return prim;
}
q=prim;
while(q->urm!=NULL && strcmp(q->urm->nume,nume)!=0)
q=q->urm;
if(q->urm!=NULL && strcmp(q->urm->nume,nume)==0)
{
p=q->urm;
q->urm=q->urm->urm;/*stergerea unui nod din
interiorul listei sau de la sfarsit*/
delete p;
}
return prim;
}
else
{
printf(“\nLista vida!”);
return prim;
}
}