You are on page 1of 5

#include<iostream>

#include<string>
using namespace std;

class Masina
{
private:
char tipCarburant;
string model;
const int anFabricatie;
int nrKm;
int* alimentare;
int nrAlimentari;
static float pretLitruBenzina;

public:
Masina() :anFabricatie(2019)
{
this->model = "N\\A";
this->nrKm = 0;
this->alimentare = NULL;
this->nrAlimentari = 0;
}

Masina(string model, int anFabricatie, int nrKm, int* alimentare, int


nrAlimentari) :anFabricatie(anFabricatie)
{
this->model = model;
this->nrKm = nrKm;
this->nrAlimentari = nrAlimentari;
if (alimentare != NULL)
{
this->alimentare = new int[this->nrAlimentari];
for (int i = 0; i < this->nrAlimentari; i++)
this->alimentare[i] = alimentare[i];
}
else
this->alimentare = NULL;
}

Masina(const Masina& m) :anFabricatie(m.anFabricatie)


{
this->model = m.model;
this->nrKm = m.nrKm;
this->nrAlimentari = m.nrAlimentari;
if (m.alimentare != NULL)
{
this->alimentare = new int[this->nrAlimentari];
for (int i = 0; i < this->nrAlimentari; i++)
this->alimentare[i] = m.alimentare[i];
}
else
this->alimentare = NULL;
}

Masina& operator=(const Masina& m)


{
//dezalocare zm ocupata anterior de vectorul alimentare
if (this->alimentare != NULL)
delete[] this->alimentare;
this->model = m.model;
this->nrKm = m.nrKm;
this->nrAlimentari = m.nrAlimentari;
if (m.alimentare != NULL)
{
this->alimentare = new int[this->nrAlimentari];
for (int i = 0; i < this->nrAlimentari; i++)
this->alimentare[i] = m.alimentare[i];
}
else
this->alimentare = NULL;
return *this;
}

void afisare()
{
cout << "\n*********************";
cout << "\nModel: " << this->model;
cout << ", an: " << this->anFabricatie;
cout << ", nr km: " << this->nrKm;
cout << ", nr alimentari: " << this->nrAlimentari;
cout << "\nalimentari: ";
if (this->alimentare != NULL)
{
for (int i = 0; i < this->nrAlimentari; i++)
cout << this->alimentare[i] << ", ";
}
else
cout << "-";
}

~Masina()
{
if (this->alimentare != NULL)
delete[] this->alimentare;
}

//declar functie friend


friend ostream& operator<<(ostream& out, const Masina& m)
{
out << "\n*********************";
out << "\nModel: " << m.model;
out << ", an: " << m.anFabricatie;
out << ", nr km: " << m.nrKm;
out << ", nr alimentari: " << m.nrAlimentari;
out << "\nalimentari: ";
if (m.alimentare != NULL)
{
for (int i = 0; i < m.nrAlimentari; i++)
out << m.alimentare[i] << ", ";
}
else
out << "-";
return out;
}

friend istream& operator>>(istream& in, Masina& m)


{
cout << "Model: ";
in >> m.model;
cout << "Nr km: ";
in >> m.nrKm;
cout << "Nr alimentari: ";
in >> m.nrAlimentari;
//obj m exista deja
if (m.alimentare != NULL)
delete[] m.alimentare;
if (m.nrAlimentari != 0)
{
m.alimentare = new int[m.nrAlimentari];
for (int i = 0; i < m.nrAlimentari; i++)
in >> m.alimentare[i];
}
else
m.alimentare = NULL;
return in;
}

Masina operator+(int nrKmSupl)


{
//this-ul se copiaza in alt obj
//se returneaza acel obj actualizat
Masina m = *this;
m.nrKm += nrKmSupl;
return m;
}

friend Masina operator+(int nrKmSupl, Masina m)


{
/*Masina mRez = m;
mRez.nrKm += nrKmSupl;
return mRez;*/

return m + nrKmSupl;
}

//pre-incrementare
Masina& operator++()
{
this->nrKm++;
return *this;
}

//post-incrementare
Masina operator++(int)
{
Masina mRez = *this;
this->nrKm++;
//returnez starea anterioara a obj
return mRez;
}

Masina& operator+=(int alimentareSupl)


{
//this-ul se modifica
//o copie a vectorului anterior
int* alimentareNoua = new int[this->nrAlimentari + 1];
for (int i = 0; i < this->nrAlimentari; i++)
alimentareNoua[i] = this->alimentare[i];
alimentareNoua[this->nrAlimentari] = alimentareSupl;
this->nrAlimentari++;
//dezalocare zm ptr vectorul anterior
if (this->alimentare != NULL)
delete[] this->alimentare;
//modificam vectorul obj this
this->alimentare = alimentareNoua;
return *this;
}

operator float()
{
int suma = 0;
for (int i = 0; i < this->nrAlimentari; i++)
suma += this->alimentare[i];
if (this->nrAlimentari != 0)
return suma / (float)this->nrAlimentari;
else
return 0;
}

int& operator[](int index)


{
if (index >= 0 && index < this->nrAlimentari)
return this->alimentare[index];
}

int operator()(int li, int ls)


{
int max = 0;
if (li >= 0 && ls < this->nrAlimentari && li <= ls)
{
for (int i = li; i <= ls; i++)
if (this->alimentare[i] > max)
max = this->alimentare[i];
}
return max;
}

void setModel(string modelNou)


{
this->model = modelNou;
}

string getModel()
{
return this->model;
}

void setAlimentare(int* alimentareNoua, int nrNou)


{
if (this->alimentare != NULL)
delete[] this->alimentare;
this->nrAlimentari = nrNou;
this->alimentare = new int[this->nrAlimentari];
for (int i = 0; i < this->nrAlimentari; i++)
this->alimentare[i] = alimentareNoua[i];
}
};
float Masina::pretLitruBenzina = 5.4;

int main()
{
int alimentari1[] = { 20,50,20,40 };
int alimentari2[] = { 40,20,30 };
Masina m1("Mazda", 2019, 1000, alimentari1, 4);
Masina m2;
m1 += 10; //adauga o noua alimentare in valoare de 10 la vector
//m1.operator+=(10);
cout << m1;
m2 += 5;
cout << m2;

float alimentareMedie = m1; //apel cast implicit


cout << "\nAlimentare medie: " << alimentareMedie;
//int rez = m1 - 4;

//operator index
int alimentare = m1[1]; //m1.operator[](1)
cout << "\nAlimentarea de pe index 1: " << alimentare;
m1[0] = 25;
cout << m1;

//operator functie
int alimentareMaxima = m1(1, 3);
cout << "\nAlimentare maxima: " << alimentareMaxima;

//cout << m1.alimentareMinima();


m1.setModel("Dacia");
cout << m1;
cout << "\nModelul masinii: " << m1.getModel();
m1.setAlimentare(alimentari2, 3);
return 0;
}

You might also like