Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019
Přehled Dokončení spojového seznamu 1 Dokončení spojového seznamu 2 3
Odstranění prvku za zadaným prvek 1 získej pomocný ukazatel na prvek následující za zadaným 2 pokud je následník zadaného prvku zarážka, posuň zarážku na mazaný prvek 3 do položky dalsi zadaného prvku ulož ukazatel na následníka mazaného prvku 4 vymaž prvek, na který ukazuje pomocný ukazatel 1 void smazza(seznam *us, Prvek *pom))){ 2 Prvek *naslednik = pom->dalsi; 3 if(naslednik == us->zarazka){ 4 us->zarazka = pom; 5 } 6 pom->dalsi = naslednik->dalsi; 7 delete naslednik; 8 }
Odstranění prvku se zadanými daty 1 najdi prvek obsahující zadaná data 2 do nalezeného prvku překopíruj data z jeho následníka 3 smaž následníka pomocí výše popsané funkce 1 void smaz(seznam *us, Data co){ 2 Prvek *pom = najdi(us, plat); 3 if(!pom) 4 return; 5 pom->data = pom->dalsi->data; 6 smazza(us, pom); 7 }
Přehled Dokončení spojového seznamu 1 Dokončení spojového seznamu 2 3
Softwarový objekt Objekt Softwarový objekt představuje model nějaké části reálného světa. Datový typ určen: množinou přípustných hodnot množinou operací, které lze s hodnotami provádět Objektový typ: vlastní datové typy umožňují definovat množinu hodnot objektové typy umožňují navíc definovat i operace nad touto množinou
Terminologie třída (class) jiné označení pro objektový typ instance, objekt (object) proměnná, konstanta nebo parametr objektového typu Položky třídy: atribut datová položka metoda funkční položka funkce konstruktor destruktor vlastnost atribut doplněný o přístupové metody
Vlastnosti objektových typů 1 zapouzdření (encapsulation) definice datových složek společně s metodami omezení přístupu k určitým složkám 2 dědičnost (inheritance) možnost od jedné třídy (předek) odvodit jinou třídu (potomek) potomek zdědí metody a atributy předka, některé lze překrýt, jiné lze doplnit Potomek může zastoupit předka. 3 mnohotvárnost (polymorfismus) práce s instancemi neznámého typu: předek nebo potomek? určení typu instance za běhu programu
Syntaxe Dokončení spojového seznamu Objektový typ class identifikátor [:identifikátory předků]{ <seznam sekcí> } Sekce <specifikace přístupu> <seznam metod> <seznam atributů> Určení přístupu: public položky veřejné sekce přístupné odkudkoliv private položky soukromé sekce dostupné jen v rámci třídy, ve které byly deklarovány protected položky chráněné sekce dostupné jen v rámci třídy, ve které byly deklarovány, a jejích potomcích
Práce s objektovými typy instance obvykle vytvářeny dynamicky konstruktor speciální metoda sloužící k inicializaci instance, obvykle nastaví hodnoty atributů přístup k požadované položce pomocí operátoru selekce (tečka:.) při implementaci metod musíme kvalifikovat metodu jménem třídy, ke které náleží ukazatel this na aktuální instanci destruktor speciální metoda sloužící k úklidu před zrušením instance (uvolnění paměti, uzavření otevřených souborů,... )
Přehled Dokončení spojového seznamu 1 Dokončení spojového seznamu 2 3
Zadání Dokončení spojového seznamu Zadání příkladu Napište třídu TVektor, která bude reprezentovat bod ve dvourozměrném prostoru. Třída bude mít dva soukromé atributy X a Y. Naprogramujte veřejné přístupové metody, které umožní získat a měnit hodnotu těchto atributů. Dále zkuste napsat metody pro tisk a pro získání vzdálenosti od počátku soustavy souřadné (velikost radiusvektoru).
Třída TVektor 1 class TVektor{ 2 public: //verejna sekce 3 TVektor(); //konstruktory 4 TVektor(float xx, float yy); 5 ~TVektor(); //destruktor 6 void tisk(); 7 float delka() const; 8 void nastavx(float xx); 9 void nastavy(float yy); 10 float vratx() const; 11 float vraty() const; 12 private: //soukroma sekce 13 float x, y; 14 };
Přístupové metody 1 void TVektor::tisk(){ 2 cout << "[" << vratx() << ", " << vraty() 3 << "]" << endl; 4 } 5 void TVektor::nastavX(float xx){ 6 this->x = xx; //oouziti ukazatele this 7 } 8 float TVektor::vratX() const{ 9 return x; 10 } 11 float TVektor::delka() const{ 12 return sqrt(vratx()*vratx()+vraty()*vraty()); 13 }
Konstruktory a destruktor 1 TVektor::TVektor(float xx, float yy){ 2 nastavx(xx); 3 nastavy(yy); 4 } 5 6 TVektor::TVektor(){ 7 TVektor(0, 0); 8 } 9 10 TVektor::~TVektor(){ 11 std::cout << "Rusi se instance" << std::endl; 12 }
Použití třídy TVektor 1 int main(){ 2 TVektor a; 3 a.nastavx(3); 4 a.nastavy(2); 5 TVektor *b = new TVektor(3, -2); 6 a.tisk(); 7 b->tisk(); 8 cout << "Delka vektoru a:" << a.delka() << endl; 9 delete b; 10 return 0; 11 }
Závěr Dokončení spojového seznamu 1 opakování již procvičených pojmů struktury práce s dynamickou pamětí operátory new, delete dokončení neobjektové implementace spojového seznamu 2 nové pojmy úvod do objektově orientovaného programování třída, objekt metody, atributy zapouzdření specifikace přístupu přístupové metody
Zadání domácího úkolu Zadání úkolu Napište program, který číslo zadané v desítkové soustavě převede do šestnáctkové soustavy. Program rozdělte do funkcí: jedna funkce provede vlastní převod a uloží výsledek do paměti a druhá funkce uložený výsledek vypíše na standardní výstup.