You are on page 1of 5

#include<iostream>

#include<fstream>
using namespace std;
class Avion
{
private:
char *marca;
int viteza;
const int nrLocuri;
int nrZile;
int *vectorZboruri;
char categ;
static int nrAvioanePasageri;
static int nrAvioaneMilitare;
public:
Avion():nrLocuri(0)
{
marca = new char[strlen("Airbus")+1];
strcpy(marca, "Airbus");
viteza=0;
nrZile=0;
vectorZboruri=NULL;
categ = 'P';
nrAvioanePasageri++;
}
Avion(char *m,int v,int nrl, int nrz, int *vz, char c):nrLocuri(nrl)
{
marca=new char[strlen(m)+1];
strcpy(marca, m);
viteza=v;
nrZile=nrz;
vectorZboruri=new int[nrZile];
for(int i=0;i<nrZile;i++)
vectorZboruri[i]=vz[i];
categ=c;
if(categ=='P')
nrAvioanePasageri++;
else nrAvioaneMilitare++;
}
Avion(Avion &a):nrLocuri(a.nrLocuri)
{
marca=new char[strlen(a.marca)+1];
strcpy(marca, a.marca);
viteza=a.viteza;
nrZile=a.nrZile;
vectorZboruri=new int[nrZile];
for(int i=0;i<nrZile;i++)
vectorZboruri[i]=a.vectorZboruri[i];
categ=a.categ;
if(categ=='P')
nrAvioanePasageri++;
else nrAvioaneMilitare++;
}
//apel constr copiere:Avion a2=a1; (a2 a fost creat la momentul apelului
)
//folosirea operatorului egal Avion a3;

a3=a2; (lucram cu 2 ob existen

te si se modif a3)
~Avion()
{
delete [] marca;
delete [] vectorZboruri;
if(categ=='P')
nrAvioanePasageri--;
else nrAvioaneMilitare--;
}
void afisare()
{
cout<<"Avionul "<<marca<<" are viteza "<<viteza<<" nr de locuri
"<<nrLocuri<<" categoria "<<categ<<" si a zburat "<<nrZile<<" zile."<<endl;
cout<<"Vector de zboruri pe zile: ";
for(int i=0;i<nrZile;i++)
cout<<vectorZboruri[i]<<' ';
cout<<endl;
}
friend ostream& operator<<(ostream& iesire,Avion a) // daca definesc fun
ctia ca fiind void nu o pot apela "<<" in cascada
{
iesire<<"Avionul "<<a.marca<<" are viteza "<<a.viteza<<" nr de l
ocuri "<<a.nrLocuri<<" categoria "<<a.categ<<" si a zburat "<<a.nrZile<<" zile."
<<endl;
iesire<<"Vector de zboruri pe zile: ";
for(int i=0;i<a.nrZile;i++)
iesire<<a.vectorZboruri[i]<<' ';
iesire<<endl;
return iesire;
}
friend ofstream& operator<<(ofstream& iesire,Avion a) // daca de
finesc functia ca fiind void nu o pot apela "<<" in cascada
{
iesire<<"Avionul "<<a.marca<<" are viteza "<<a.viteza<<" nr de l
ocuri "<<a.nrLocuri<<" categoria "<<a.categ<<" si a zburat "<<a.nrZile<<" zile."
<<endl;
iesire<<"Vector de zboruri pe zile: ";
for(int i=0;i<a.nrZile;i++)
iesire<<a.vectorZboruri[i]<<' ';
iesire<<endl;
return iesire;
}
friend istream& operator>>(istream& intrare, Avion &a)
{
delete [] a.marca;
a.marca=new char[50];
cout<<"Marca: "<<endl;
//alocarea optimizata
//intrare>>buffer;
//a.marca=new char[strlen(buffer)+1];
//strcpy(a.marca, buffer);
intrare>>a.marca;
cout<<"Viteza: "<<endl;
intrare>>a.viteza;

cout<<"Nr zile: "<<endl;


intrare>>a.nrZile;
delete [] a.vectorZboruri;
a.vectorZboruri=new int[a.nrZile];
cout<<"Valori vector: "<<endl;
for(int i=0;i<a.nrZile;i++)
intrare>>a.vectorZboruri[i];
if(a.categ=='P')
Avion::nrAvioanePasageri--;
else Avion::nrAvioaneMilitare--;
cout<<"Categorie: "<<endl;
intrare>>a.categ;
if(a.categ=='P')
Avion::nrAvioanePasageri++;
else Avion::nrAvioaneMilitare++;
return intrare;
}
friend ifstream& operator>>(ifstream& intrare, Avion &a)
{
delete [] a.marca;
//cout<<"Marca: "<<endl;
//alocarea optimizata
//intrare>>buffer;
//a.marca=new char[strlen(buffer)+1];
//strcpy(a.marca, buffer);
intrare>>a.marca;
intrare>>a.viteza;
intrare>>a.nrZile;
delete [] a.vectorZboruri;
a.vectorZboruri=new int[a.nrZile];
for(int i=0;i<a.nrZile;i++)
intrare>>a.vectorZboruri[i];
if(a.categ=='P')
Avion::nrAvioanePasageri--;
else Avion::nrAvioaneMilitare--;
intrare>>a.categ;
if(a.categ=='P')
Avion::nrAvioanePasageri++;
else Avion::nrAvioaneMilitare++;
return intrare;
}
void operator=(Avion &a) //operatorul egal este fct membra a clasei pt c
a nu friend, ci void
{
delete [] marca;
marca=new char[strlen(a.marca)+1];
strcpy(marca, a.marca);
viteza=a.viteza;
nrZile=a.nrZile;
delete [] vectorZboruri;
vectorZboruri=new int[nrZile];
for(int i=0;i<nrZile;i++)
vectorZboruri[i]=a.vectorZboruri[i];
if(categ=='P')
nrAvioanePasageri--;
else nrAvioaneMilitare--;

categ=a.categ;
if(categ=='P')
nrAvioanePasageri++;
else nrAvioaneMilitare++;
}
bool operator<(Avion a)
{
if(this->viteza<a.viteza)// sau (*this).viteza
return true;
else return false;
}
bool operator>(Avion a)
{
if(this->viteza>a.viteza)
return true;
else return false;
}
bool operator==(Avion a)
{
if(this->viteza==a.viteza)
return true;
else return false;
}
//op index - se fol in cadrul claselor care contin siruri sau vectori :
[]; scop: ret el de pe o anumita poz si sa valideze poz ca se afla in intervalul
corescpunzator
/*int operator[](int i)
{
if(i>=0 && i<this->nrZile)
return this->vectorZboruri[i];
else return -1;
}*/
char operator[](int i)
{
if(i>=0 && i<(strlen(this->marca)))
return this->marca[i];
else return -1;
}
operator double()// fac med elem din vect de zboruri
{
int suma=0;
for(int i=0;i<this->nrZile;i++)
suma +=this->vectorZboruri[i];
return (double)suma/this->nrZile;
}
Avion operator++()//a++
{
this->viteza++;
return *this;
}
friend Avion operator++(Avion &a, int)//++a
{
Avion temp = a;

a.viteza++;
return temp;
}
};
int Avion::nrAvioanePasageri=0;
int Avion::nrAvioaneMilitare=0;
void main()
{
Avion a1;
int vz1[5]={3,2,4,1,3};
Avion a2("Boeing",900,120,5,vz1,'p');
Avion a3=a2;
a1.afisare();
a2.afisare();
a3.afisare();
if(a2>a3)
cout<<"a2 mai mare ca a3"<<endl;
else if(a2<a3)
cout<<"a2 mai mic ca a3"<<endl;
else cout<<"a2=a3"<<endl;
cout<<a2[2]<<endl;
cout<<"Media este: "<<(double)a2<<endl;
cout<<a2++<<endl;
cout<<++a2<<endl;
}

You might also like