Sunteți pe pagina 1din 6

Laboratorul 5.

Clase i funcii prietene



O funcie este prieten (friend) cu o clas dac are acces la datele membru private ale
acelei clase. O funcie prieten poate fi o funcie global sau chiar o funcie membru a altei
clase.
O clas este prieten cu o alt clas dac are acces la datele membru ale acesteia.
O funcie, respectiv o clas prieten se declar utiliznd cuvntul friend astfel:
1. friend tip_funcie nume_funcie (Lista_parametri_formali); // funcie friend global
2. friend tip_funcie nume_clas :: nume_functie (Lista_parametrii_formali); // funcie
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 sfrsit
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;
}
}

S-ar putea să vă placă și