Zadanie 11
Zaprojektować i zaimplementować hierarchię klas odwzorowującą roboty przemysłowe dwóch typów ( R1
i R2 ). Klasy robotów wyposaŜyć w polimorficzną metodę praca() wyświetlającą na standardowym wyjściu
operację wykonywaną przez robota.
Roboty zestawić w linię produkcyjną ( odwzorowaną w programie przez klasę Line ). W linii produkcyjnej
roboty róŜnych typów mogą być ustawione w dowolny sposób. W tym celu naleŜy zaimplementować metody
składowe klasy Line pozwalające na jej budowanie oraz modyfikację ( dodaj(), usun_ostatni(),
usun_wszystkie(), dodaj_n(), usun_n() ). Klasa Line powinna posiadać metodę do roboty()
uruchamiającą sekwencyjne wszystkie roboty w linii produkcyjnej, a takŜe metodę umoŜliwiającą tworzenie kopii
linii produkcyjnej.
Jako „nośnik danych” w klasie Line wykorzystać zasobnik sekwencyjny vector.
UWAGA !
KaŜdy z destruktorów klas powinien na koniec swego działania wyświetlić na ekranie informację o jego wywołaniu.
Przed zdefiniowaniem klasy Line warto skorzystać ze słowa kluczowego typedef ( typedef robot* wsk; )
Przykład kodu testującego
//...
{ Line l1 ; }
{ Line l2(5) ; }
cout << "******1*******" << endl;
Line lp1, lp2;
lp1.dodaj(new R1);
lp1.dodaj(new R1);
lp1.dodaj(new R2);
lp1.dodaj(new R2);
lp2=lp1;
{
Line lp3;
lp3.dodaj(new R1);
lp3.dodaj(new R2);
lp3.dodaj(new R1);
lp3.dodaj(new R2);
lp3.usun_ostatni();
cout << "******2*******" << endl;
lp3.do_roboty();
lp1 = lp3;
}
cout << "******3*******" << endl;
lp1.do_roboty();
cout << "******4*******" << endl;
wsk r[] = {new R2, new R1};
line lp4(r, r+2);
lp4.dodaj_n(1, new R2)
lp4.do_roboty();
cout << "******5*******" << endl;
lp4 = lp2;
lp4.do_roboty();
cout << "******6*******" << endl;
line lp6(lp1);
lp6.usun_n(1);
lp6.do_roboty();
lp6.usun_wszystkie();
lp6.do_roboty();
cout << "******7*******" << endl;
delete r[0];
delete r[1];
//...
Решение
//H.h
#pragma once
#include <iostream>
using namespace std;
#define STOP system("pause");
#define COLOR_GREEN_TEXT system("color 0A");
/*Athor Dombrovsky I.V.*/
#include <iostream>
#include <string>
#define _TEXT_GREEN_CMD system("color 0A");
#define _STOP_CONSOLE_WINDOWS system("pause");
using namespace std;
//========================================================
class Robot // Abstract class
{
public:
static int count_robots; // count objects (Security)
Robot() : str(""), step(0) { Robot::count_robots++; } //DEFAULT
Robot(string str) :str(str) { Robot::count_robots++; }
Robot(string str, int step) :str(str), step(step) { Robot::count_robots++; }
~Robot() { Robot::count_robots--; }
virtual void action() = 0; // Virtual method
Robot & operator -=(int value) // Overload operator -=
{
this->step -= value;
return *this;
}
friend ostream& operator << (ostream &out, const Robot & obj) // overload operator <<
{
if(obj.step > 0) // SHOW
out << obj.str << " na " << obj.step << " ones " << endl;
else
cout << obj.str << endl; // last output
return out;
}
protected: // Security
int step;
string str;
};
//========================================================
int Robot::count_robots = -1; // Inicialization static veriable (Security key)
//========================================================
class rt1 : public Robot // class rt1 [robots]
{
public:
rt1() :Robot() {} // DEFAULT
rt1(string str) :Robot(str) { Robot::count_robots++; }
rt1(string str, int step) :Robot(str, step) {}
void action() const { cout << str << endl; } // Output const SMS
virtual void action() override
{
if(step > 0) // SHOW
cout << str << " na " << step << " ones " << endl;
else
cout << str << endl; // last output
}
};
//========================================================
class rt2 : public Robot // class rt2 [robots]
{
public:
rt2() :Robot() {} // DEFAULT
rt2(string str, int step) : Robot(str, step) {}
virtual void action() override
{
if(step > 0)
cout << str << " na " << step << " ones " << endl;
}
};
//========================================================
int main() {
_TEXT_GREEN_CMD // CONST DISPLAY TEXT COLOR GREEN
//--------------------------------------------------------
Robot ** linia = new Robot *[5];
const rt1 robot1("apply product finished");
robot1.action();
cout << "**********3**********\n";
//--------------------------------------------------------
linia[0] = new rt1("put down");
linia[1] = new rt2("stop", 5);
linia[2] = new rt2("right", 4);
linia[3] = new rt2("stop", 7);
linia[4] = new rt1(robot1);
for (int i = 0; i < 5; i++)
linia[i]->action();
cout << "**********7**********\n";
//--------------------------------------------------------
*linia[3] -= 5;
linia[3]->action();
cout << "**********8**********\n";
//--------------------------------------------------------
cout << "Count of robots: " << Robot::count_robots << endl;
cout << "********9*******" << endl;
//--------------------------------------------------------
for (int i = 0; i << 5; i++)
{
cout << *linia[i];
delete linia[i];
}
cout << "Count of robots: " << Robot::count_robots << endl;
linia[0] = new rt1("put down");
linia[1] = new rt2("stop", 5);
linia[2] = new rt2("right", 4);
linia[3] = new rt2("stop", 7);
linia[4] = new rt1(robot1);
cout << "Count of robots: " << Robot::count_robots << endl;
cout << "**********12**********\n";
//--------------------------------------------------------
for(int i = 0; i < 5; i++)
delete linia[i]; // CLEAR MEMORY
_STOP_CONSOLE_WINDOWS // PAUSE SYSTEM CONSOLE WINDOWS
return 0;
}