Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de laborator nr. 3
la disciplina “Programarea orientată pe obiecte”
CHIŞINĂU 2021
Tema : Moştenirea şi compoziţia
Scopul lucrării:
studierea moştenirii, avantajele şi dezavantajele
studierea compoziţiei
studierea regulilor de definire a moştenirii şi compoziţiei
studierea formelor de moştenire
studierea iniţializatorilor
principiul de substituţie
moştenire şi compoziţie
Sarcina lucrari:
De creat clasa camera, care conţine suprafaţă. Determinaţi constructorii şi
metodele de acces. Creaţi clasa apartamente cu o odaie, care conţine o odaie şi o
bucătarie (suprafaţa ei), etajul (camera este în clasa apartament cu o odaie).
Determinaţi constructorii, metodele de acces. Determinaţi clasa
derivată apartamente cu o odaie cu adresă (un câmp adăugător - adresa).
Determinaţi constructorii, destructorii şi fluxul de ieşire.
Realizarea sarcinii:
Programul dat a fost compus din două fişiere cu numele şi „File1.cpp”(vezi anexa
A) „File2.h”,(vezi fig.1) în care se conţine funcţia „pause()” care este folosită pentru
vizualizarea programului mai comod şi functia de afisare a unei linii, şi definirea unor
culori.
Conţinutul fisierului “File2.h”:
Fig. 1
3.1 Explicarea clasei „camera”:
class camera{ // numele
clasei „camera”
private: //variabile
private
int suprafata; //variabile,
functii publice
public:
camera():suprafata(0){}; //constructor
implicit
camera(int s):suprafata(s){}; //constructor
explicit
~camera(){suprafata=0;}; //destructor
ret_s(){return suprafata;}; //functie de
returnare a suprafetei
ins_s(int n){suprafata=n;}; //functie de
inscrierea suprafetei
camera(camera &obj)
{suprafata=obj.suprafata;}; //constructor de
copiere
//functie prietena, supraincarcare
operatorului de intrare (cin>>)
friend istream & operator>>(istream & in, camera & obj){
in>>obj.suprafata;
return in; };
//functie prietena, supraincarcare
operatorului de iesire (cout<<)
friend ostream & operator<<(ostream & out, camera & obj){
out<<obj.suprafata<<" m2";
return out; };
camera & operator=(camera & obj){ //constructor
de copiere
this->suprafata=obj.suprafata;
return *this; };
};
class AP1C:public virtual camera{
public:
camera odaie;
camera bucatarie;
int etaj;
AP1C(){ odaie.ins_s(0); bucatarie.ins_s(0);
etaj=0; }; //constructor implicit
AP1C(int o, int b, int et)
{
//constructor explicit
odaie.ins_s(o);
bucatarie.ins_s(b);
etaj=et;
};
~AP1C(){odaie.ins_s(0); bucatarie.ins_s(0);
etaj=0;}; //destructor
//*************************************SUPRAINCARCAREA
OPERATORULUI CIN >>
friend istream &operator>>(istream & in, AP1C & obj){
char bufer[50];
cout<<"Introdu suprafata odaiei= ";
in>>obj.odaie;
cout<<"Introdu suprafata bucatariei= ";
in>>obj.bucatarie;
cout<<"Introdu Etajul= ";
in>>obj.etaj;
return in;};
//***********************************SUPRAINCARCAREA
OPERATORULUI COUT <<
friend ostream &operator<<(ostream &out, AP1C & obj){
out<<"Suprafata odaiei= "<<obj.odaie<<endl;
out<<"Suprafata bucatariei= "<<obj.bucatarie<<endl;
out<<"Etajul: "<<obj.etaj<<endl;
return out; };
};
3.3 Explicarea clasei „AP1CA (APartamente cu 1 Camera cu Adresa):
class AP1CA:public AP1C{
char *stada;
public:
AP1CA():AP1C(){stada=NULL; };
AP1CA(char *str,int o, int b, int et){
this->stada=new char[strlen(str)+1];
strcpy(this->stada,str);
AP1C(o,b,et); };
AP1CA(AP1CA & obj){
this->stada=new char[strlen(obj.stada)+1];
strcpy(this->stada,obj.stada);
odaie.ins_s(obj.odaie.ret_s());
bucatarie.ins_s(obj.bucatarie.ret_s());
etaj = obj.etaj; };
~AP1CA(){odaie.ins_s(0); bucatarie.ins_s(0);
etaj=0; delete []stada; stada=NULL;};
friend istream & operator>>(istream &in, AP1CA &obj){
char buf[50]; int s;
cout<<"Introdu strada: "; in>>buf;
obj.stada = new char[strlen(buf)+1];
strcpy(obj.stada,buf);
cout<<"Etajul: "; in>>obj.etaj;
cout<<"Suprafata odaiei= "; in>>s; obj.odaie.ins_s(s);
cout<<"Suprafata bucatariei= "; in>>s;
obj.bucatarie.ins_s(s);
return in; };
void main(){
start: AP1CA *tab; /
/start - eticheta
del;
//curata ecranu
int n;
white;
//culoarea alba
cout<<"1 - Introdu un numar N de apartamente"<<endl;
cout<<"2 - Afiseaza apartamentile inscrise"<<endl;
cout<<"Esc - Iesire"<<endl;
sus:
switch (getch()) {
case '1':{ del;
cout<<"N= ";
cin>>n;
tab = new AP1CA[n];//alocare de
memorie p/u „n” apartamente cu 1 camara cu Adr
if (tab==NULL) { /
/verificare daca sa alocat cu succes
cout<<"Memorie
insuficienta !"<<endl;
pause(); exit(1);
}
else if (tab!=NULL){
del; yellow; linie();
for (int i = 0; i < n; i++) {
cyan;
cout<<"Apartamenul Nr. "<<i+1<<endl;
white;
cin>>tab[i];
//introducerea apartamentilor
yellow;
linie(); }
pause(); } break;
};
case '2':{ del;
for (int i=0; i<n; i++){
//afisarea apartamentilor
yellow; linie();
cyan; cout<<"Apartamenul Nr. "<<i+1<<endl;
white; cout<<tab[i]<<endl;
yellow;
linie(); }
pause(); break;};
case 27:{ pause(); exit(1);};
default : goto sus;
}
goto start; }
Fig. 2
3.5 Afisarea apartamentilor cu 1 camera (Fig. 3):
Fig. 3
Concluzi:
In urma efectuarii lucrarii date am determinat ca mediul de prgramare C++
este cu mult flexibil ca C, care ne permite sa manipulam cu informatia intr-un mod rapid
si eficient fara a induce erori grosolane, si am aflat ca utilizarea claselor este cu mult
mai comod si mai rapid in eleborarea unui program.
Am aflat ca moştenirea reprezintă existenţa unor particularităţi de schimbare
independenta a claselor cu o interfaţă unică. Compoziţia reprezintă încă un mecanism,
legat de programarea orientată pe obiecte, care reprezintă relaţia dintre obiecte, atunci
când moştenirea este relaţia dintre clase.
Moştenirea realizează relaţia a fi „is a ”. Cîine este mamifer, iar mamiferul –
animal.
Compoziţia realizează relaţia de a conţine „has a ”.
Automobilul conţine motor şi roţi.
Bibliografie
1 TOTUL DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE PROGRAMARE IN C
SI C++)[RO][Kris Jamsa][Lars Kland]
2 PROGRAMARE IN C_C++ CULEGERE DE PROBLEME Valiriu Iorga
3 Initiere in C++, Programarea orientata pe obiecte (Editie Prevazuta) Cluj-Napoca
1993
Anexa A
Fişierul „File1.cpp”
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include "File2.h"
class camera{
private:
int suprafata;
public:
camera():suprafata(0){};
camera(int s):suprafata(s){};
~camera(){suprafata=0;};
ret_s(){return suprafata;};
ins_s(int n){suprafata=n;};
camera(camera &obj){suprafata=obj.suprafata;};
friend istream & operator>>(istream & in, camera & obj){
in>>obj.suprafata;
return in; };
friend ostream & operator<<(ostream & out, camera & obj){
out<<obj.suprafata<<" m2";
return out; };
camera & operator=(camera & obj){
this->suprafata=obj.suprafata;
return *this; };
};
Fişierul „File2.h”
# define white
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11) //
alb
# define yellow
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10)
//galben
# define cyan
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8) /
/cyan
# define del clrscr(); //curata ecranul
//******************MENU PAUZA
linie(){
for (int i = 0; i < 51; i++) cout<<"-";
cout<<endl;
};
void pause(){
yellow;
cout<<endl<<endl<<"Apasati orice tasta...";
getch();
white;
};