[C++] Przeciążone operatory, dodawanie dwóch obiektów


(niesuszek) #1

Witam. Mam dwa pytania co do napisanego przeze mnie kodu:

  1. Linia 223 i 227 - powinienem użyć tam polimorfizmu, czy jest to poprawnie napisane?

  2. "Zademonstruj działanie tego operatora tworząc dwa obiekty lokalne z

wykorzystaniem ich konstruktorów domyślnych, a następnie za pomocą operatora += dodając do każdego z nich wszystkie obiekty jego typu znajdujące się w liście." - jak to zrobić?

Proszę nie zwracać uwagi na etykietę goto, została ona zrobiona na szybko - wiem, że nie powinno się jej stosować. Nazwy zmiennych też do poprawy, ale to już na końcu.

KOD:

#include

#include

#include


using namespace std;

int a,b,c,d,f;

string e,g;


class silnik

{

protected:

	int moc;

	int wymiary;

public:

	silnik *nast;

	static int x;

public:

	silnik() : moc(1), wymiary(1), nast(NULL) { x++; };

	silnik(int a, int b) : moc(a), wymiary(b), nast(NULL) { x++; };

	silnik(const silnik &dane) : moc(dane.moc), wymiary(dane.wymiary), nast(NULL) { x++; };

	~silnik(){ 

		x--;

		delete nast; 

	};


	virtual void wypisz() {

		cout<<"Moc silnika: "<
		cout<<"Wymiary silnika: "<
	}

	void wypiszListe() {

		wypisz();

		if(nast!=NULL) {

			cout<
			nast->wypiszListe();

		}

	}


	void wypisz_stat() {

		cout << "x: " << x << endl;

	}

};


class elektryczny : public silnik

{

protected:

	int napiecie;

	int czas_pracy;

public:

	elektryczny() : silnik(a,b), napiecie(1), czas_pracy(1) {};

	elektryczny(int a, int b, int c, int d) : silnik(a,b), napiecie(c), czas_pracy(d) {};

	elektryczny(const elektryczny &dane) : silnik(dane), napiecie(dane.napiecie), czas_pracy(dane.czas_pracy) {};

	virtual ~elektryczny() {};


	void modyfikuj() {

		cout<<"Moc silnika: ";

		cin>>a;

		cout<<"Wymiary silnika: ";

		cin>>b;

		cout<<"Napiecie: ";

		cin>>c;

		cout<<"Czas pracy: ";

		cin>>d;

	}

	void wypisz() {

		cout<<"Moc silnika: "<
		cout<<"Wymiary silnika: "<
		cout<<"Napiecie: "<
		cout<<"Czas pracy: "<
	}

	elektryczny& operator+= (int argument) { // wymagany przeciazony operator

		moc += argument;

		wymiary += argument;

		napiecie += argument;


        return elektryczny(a,b,c,d);

	}

};


class spalinowy : public silnik

{

protected:

	string rodzaj_paliwa;

	int pojemnosc;

	string rodzaj_oleju;

public:

	spalinowy() : silnik(a,b), rodzaj_paliwa("asd"), pojemnosc(1), rodzaj_oleju("fgh") {};

	spalinowy(int a, int b, string e, int f, string g) : silnik(a,b), rodzaj_paliwa(e), pojemnosc(f), rodzaj_oleju(g) {};

	spalinowy(const spalinowy &dane) : silnik(dane), rodzaj_paliwa(dane.rodzaj_paliwa), pojemnosc(dane.pojemnosc), 

		rodzaj_oleju(dane.rodzaj_oleju) {};

	virtual ~spalinowy() {};


	void modyfikuj() {

		cout<<"Moc silnika: ";

		cin>>a;

		cout<<"Wymiary silnika: ";

		cin>>b;

		cout<<"Rodzaj paliwa: ";

		cin>>e;

		cout<<"Pojemnosc: ";

		cin>>f;

		cout<<"Rodzaj oleju: ";

		cin>>g;

		cout<
	}

	void wypisz() {

		cout<<"Moc silnika: "<
		cout<<"Wymiary silnika: "<
		cout<<"Rodzaj paliwa: "<
		cout<<"Pojemnosc: "<
		cout<<"Rodzaj oleju: "<
	}

	spalinowy& operator+= (int argument) { // wymagany przeciazony operator

		moc += argument;

		wymiary += argument;

		pojemnosc += argument;


        return spalinowy(a,b,e,f,g);

	}

};


int i;

int silnik::x=0;

silnik *glowa, *wsk;

elektryczny *wsk_pomoc;

spalinowy *wsk_pomoc2;


int main()

{

	int wybor;

	char wybor2;


powrot:

	cout<<"Witaj w bazie samochodow!"<
	cout<<"Co chcesz teraz zrobic?"<
	cout<<"1.Wpisac dane silnika elektrycznego"<
	cout<<"2.Wpisac dane silnika spalinowego"<
	cout<<"3.Wypisac wprowadzone dane i zakonczyc program"<
	cout<<"Wybor: ";

	cin>>wybor;


	if(wybor==1)

	{

		system("CLS");


		for(i=0; i<50; i++)

		{

			system("CLS");

			wsk_pomoc->modyfikuj();


			if(glowa==NULL)

				glowa = new elektryczny(a,b,c,d);


			else

			{

				wsk=glowa;

				while(wsk->nast!=NULL){

					wsk=wsk->nast;

				}

				wsk->nast=new elektryczny(a,b,c,d);

			}			


			cout<
			cin>>wybor2;


			if(wybor2=='n')

			{

				system("CLS");

				goto powrot;

			}

		}

	}


	if(wybor==2)

	{

		system("CLS");


		for(i=0; i<50; i++)

		{

			system("CLS");

			wsk_pomoc2->modyfikuj();


			if(glowa==NULL)

				glowa = new spalinowy(a,b,e,f,g);


			else

			{

				wsk=glowa;

				while(wsk->nast!=NULL)

					wsk=wsk->nast;

				wsk->nast=new spalinowy(a,b,e,f,g);

			}			


			cout<<"Czy chcesz kontynuuowac wprowadzanie danych? [t/n]"<
			cin>>wybor2;


			if(wybor2=='n')

			{

				system("CLS");

				goto powrot;

			}

		}

	}


	if(wybor==3)

	{

		elektryczny obiekt2;

		spalinowy obiekt3;

		elektryczny *mc = new elektryczny;

		spalinowy *mc2 = new spalinowy;


		system ("CLS");

		glowa->wypiszListe();

		cout<

		cout<<"STATIC:"<
		cout<<"X: "<

		cout<<"------------------------------"<

		cout<<"ELEKTRYCZNY:"<
		obiekt2.wypiszListe(); // polimorfizm????

		cout<

		cout<<"SPALINOWY:"<
		obiekt3.wypiszListe(); // polimorfizm????

		cout<

		cout<<"PRZECIAZANIE OPERATOROW - 10 + obiekt2:"<
		obiekt2 += 10;

		obiekt2.wypiszListe();

		cout<

		cout<<"PRZECIAZANIE OPERATOROW - 10 + obiekt3:"<
		obiekt3 += 10;

		obiekt3.wypiszListe();

		cout<

		// ---ELEKTRYCZNY---------------- 

		// Wypisuje typ usuwanego obiektu oraz wartosc pola statycznego

		cout<<"------------------------------"<
		if (typeid(*mc) == typeid(elektryczny)) 

			cout<<"ELEKTRYCZNY:"<

		cout<

		cout<<"STATIC:"<
		cout<<"X: "<
		delete mc;


		// ---SPALINOWY------------------

		// Wypisuje typ usuwanego obiektu oraz wartosc pola statycznego

		cout<
		if (typeid(*mc2) == typeid(spalinowy)) 

			cout<<"SPALINOWY:"<

		cout<

		cout<<"STATIC:"<
		cout<<"X: "<
		delete mc2;

		cout<<"------------------------------"<

		delete glowa;

		exit(0);

	}


	return 0;

}

-- Dodane 07.05.2012 (Pn) 20:54 -- jeżeli chodzi o polimorfizm to chyba teraz jest poprawnie:

#include

#include

#include


using namespace std;

int a,b,c,d,f;

string e,g;


class silnik

{

protected:

	int moc;

	int wymiary;

public:

	silnik *nast;

	static int x;

public:

	silnik() : moc(1), wymiary(1), nast(NULL) { x++; };

	silnik(int a, int b) : moc(a), wymiary(b), nast(NULL) { x++; };

	silnik(const silnik &dane) : moc(dane.moc), wymiary(dane.wymiary), nast(NULL) { x++; };

	~silnik(){ 

		x--;

		delete nast; 

	};


	virtual void wypisz() {

		cout<<"Moc silnika: "<
		cout<<"Wymiary silnika: "<
	}

	void wypiszListe() {

		wypisz();

		if(nast!=NULL) {

			cout<
			nast->wypiszListe();

		}

	}


	void wypisz_stat() {

		cout << "x: " << x << endl;

	}

};


class elektryczny : public silnik

{

protected:

	int napiecie;

	int czas_pracy;

public:

	elektryczny() : silnik(a,b), napiecie(1), czas_pracy(1) {};

	elektryczny(int a, int b, int c, int d) : silnik(a,b), napiecie(c), czas_pracy(d) {};

	elektryczny(const elektryczny &dane) : silnik(dane), napiecie(dane.napiecie), czas_pracy(dane.czas_pracy) {};

	virtual ~elektryczny() {};


	void modyfikuj() {

		cout<<"Moc silnika: ";

		cin>>a;

		cout<<"Wymiary silnika: ";

		cin>>b;

		cout<<"Napiecie: ";

		cin>>c;

		cout<<"Czas pracy: ";

		cin>>d;

	}

	void wypisz() {

		cout<<"Moc silnika: "<
		cout<<"Wymiary silnika: "<
		cout<<"Napiecie: "<
		cout<<"Czas pracy: "<
	}

	elektryczny& operator+= (int argument) { // wymagany przeciazony operator

		moc += argument;

		wymiary += argument;

		napiecie += argument;


        return elektryczny(a,b,c,d);

	}

};


class spalinowy : public silnik

{

protected:

	string rodzaj_paliwa;

	int pojemnosc;

	string rodzaj_oleju;

public:

	spalinowy() : silnik(a,b), rodzaj_paliwa("asd"), pojemnosc(1), rodzaj_oleju("fgh") {};

	spalinowy(int a, int b, string e, int f, string g) : silnik(a,b), rodzaj_paliwa(e), pojemnosc(f), rodzaj_oleju(g) {};

	spalinowy(const spalinowy &dane) : silnik(dane), rodzaj_paliwa(dane.rodzaj_paliwa), pojemnosc(dane.pojemnosc), 

		rodzaj_oleju(dane.rodzaj_oleju) {};

	virtual ~spalinowy() {};


	void modyfikuj() {

		cout<<"Moc silnika: ";

		cin>>a;

		cout<<"Wymiary silnika: ";

		cin>>b;

		cout<<"Rodzaj paliwa: ";

		cin>>e;

		cout<<"Pojemnosc: ";

		cin>>f;

		cout<<"Rodzaj oleju: ";

		cin>>g;

		cout<
	}

	void wypisz() {

		cout<<"Moc silnika: "<
		cout<<"Wymiary silnika: "<
		cout<<"Rodzaj paliwa: "<
		cout<<"Pojemnosc: "<
		cout<<"Rodzaj oleju: "<
	}

	spalinowy& operator+= (int argument) { // wymagany przeciazony operator

		moc += argument;

		wymiary += argument;

		pojemnosc += argument;


        return spalinowy(a,b,e,f,g);

	}

};


int i;

int silnik::x=0;

silnik *glowa, *wsk;

elektryczny *wsk_pomoc;

spalinowy *wsk_pomoc2;


int main()

{

	int wybor;

	char wybor2;


powrot:

	cout<<"Witaj w bazie samochodow!"<
	cout<<"Co chcesz teraz zrobic?"<
	cout<<"1.Wpisac dane silnika elektrycznego"<
	cout<<"2.Wpisac dane silnika spalinowego"<
	cout<<"3.Wypisac wprowadzone dane i zakonczyc program"<
	cout<<"Wybor: ";

	cin>>wybor;


	if(wybor==1)

	{

		system("CLS");


		for(i=0; i<50; i++)

		{

			system("CLS");

			wsk_pomoc->modyfikuj();


			if(glowa==NULL)

				glowa = new elektryczny(a,b,c,d);


			else

			{

				wsk=glowa;

				while(wsk->nast!=NULL){

					wsk=wsk->nast;

				}

				wsk->nast=new elektryczny(a,b,c,d);

			}			


			cout<
			cin>>wybor2;


			if(wybor2=='n')

			{

				system("CLS");

				goto powrot;

			}

		}

	}


	if(wybor==2)

	{

		system("CLS");


		for(i=0; i<50; i++)

		{

			system("CLS");

			wsk_pomoc2->modyfikuj();


			if(glowa==NULL)

				glowa = new spalinowy(a,b,e,f,g);


			else

			{

				wsk=glowa;

				while(wsk->nast!=NULL)

					wsk=wsk->nast;

				wsk->nast=new spalinowy(a,b,e,f,g);

			}			


			cout<<"Czy chcesz kontynuuowac wprowadzanie danych? [t/n]"<
			cin>>wybor2;


			if(wybor2=='n')

			{

				system("CLS");

				goto powrot;

			}

		}

	}


	if(wybor==3)

	{

		elektryczny obiekt2;

		spalinowy obiekt3;

		elektryczny *mc = new elektryczny;

		spalinowy *mc2 = new spalinowy;


		system ("CLS");

		glowa->wypiszListe();

		cout<

		cout<<"STATIC:"<

		cout<<"------------------------------"<

		cout<<"ELEKTRYCZNY:"<
		obiekt2.elektryczny::wypiszListe(); // polimorfizm????

		cout<

		cout<<"SPALINOWY:"<
		obiekt3.spalinowy::wypiszListe(); // polimorfizm????

		cout<

		cout<<"PRZECIAZANIE OPERATOROW - 10 + obiekt2:"<
		obiekt2 += 10;

		obiekt2.elektryczny::wypiszListe();

		cout<

		cout<<"PRZECIAZANIE OPERATOROW - 10 + obiekt3:"<
		obiekt3 += 10;

		obiekt3.spalinowy::wypiszListe();

		cout<

		// ---ELEKTRYCZNY---------------- 

		// Wypisuje typ usuwanego obiektu oraz wartosc pola statycznego

		cout<<"------------------------------"<
		cout<

		cout<<"STATIC:"<
		delete mc;


		// ---SPALINOWY------------------

		// Wypisuje typ usuwanego obiektu oraz wartosc pola statycznego

		cout<

		cout<<"STATIC:"<
		delete mc2;

		cout<<"------------------------------"<

		delete glowa;

		exit(0);

	}


	return 0;

}

([alex]) #2
  1. Nie jest poprawne (w obu przypadkach).

Polimorfizm będzie kiedy wywołujesz coś dla Silnik *S; S->MetodaVirtualna();

  1. Za dużo słów "tego" aby zrozumieć o co ci biega.