Programozás alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

Hasonló dokumentumok
Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai 2. Hibakeresés, tesztelés

Programozás alapjai 2. Hibakeresés, tesztelés. Hibakeresés módszerei. Nyomkövető kiírások. madártávlatból

Programozás alapjai II. (4. ea) C++ Konstr: létrehoz+inic. (ism.) Inicializáló lista. Konstans tagfüggvények. Destruktor: megszüntet (ism.

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Programozás II. 4. Dr. Iványi Péter

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Pénzügyi algoritmusok

Objektumok inicializálása

Programozás alapjai II. (2. ea) C++

3. Osztályok II. Programozás II

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok. Tesztelési követelmények.

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Programozás alapjai II. (3. ea) C++

Pénzügyi algoritmusok

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás módszertan

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Kivételkezelés a C++ nyelvben Bevezetés

C++ programozási nyelv Konstruktorok-destruktorok

Tesztelési követelmények. Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok.

117. AA Megoldó Alfréd AA 117.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Java II. I A Java programozási nyelv alapelemei

Felhasználó által definiált adattípus

500. CC Megoldó Alfréd CC 500.

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Java II. I A Java programozási nyelv alapelemei

Globális operátor overloading

Bevezetés a programozásba Előadás: A const

500. AA Megoldó Alfréd AA 500.

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

C++ programozási nyelv

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

OOP #14 (referencia-elv)

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

1. Alapok. Programozás II

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

Pénzügyi algoritmusok

Programozás C++ -ban 2007/7

AA MEGOLDÓ ALADÁR AA

Informatika terméktervezőknek

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Osztályok. 4. gyakorlat

128. AA Megoldó Alfréd AA 128.

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Kivételek, kivételkezelés a C++ nyelvben

Programozás II gyakorlat. 6. Polimorfizmus

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás alapjai II. (1. ea) C++

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

.AA Megoldó Alfréd AA.

JAVA PROGRAMOZÁS 2.ELŐADÁS

Elemi Alkalmazások Fejlesztése II.

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Programozás II. 2. Dr. Iványi Péter

Java és web programozás

5. Gyakorlat. struct diak {

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozás C++ -ban

Java és web programozás

Alprogramok, paraméterátadás

Maximum kiválasztás tömbben

Osztály és objektum fogalma

Objektumelvű programozás

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Programozás alapjai II. (1. ea) C++

A C programozási nyelv I. Bevezetés

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

A C programozási nyelv I. Bevezetés

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás C++ -ban

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Bevezetés a C++ programozási nyelvbe

Mit ír ki? feladatok megoldásokkal

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Szövegek C++ -ban, a string osztály

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C++ Gyakorlat jegyzet 5. óra. A C++ szabvány több memóriatípust különít el. Ezek közül elsősorban a stack-et használtuk eddig.

228. AA Default Konstruktor AA 228.

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

1000.AA Megoldo Alfréd 1000.A

Átírás:

Programozás alapjai II. (3. ea) C++ konstruktor és értékadás, dinamikus szerkezetek Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 1 - Panaszok kezelése Gyakorlat/laborvezető, előadó, dékán, rektor,... Értem a jelzést, a felháborodást nem. Még 3 db Jporta feladat lesz, ami VAGY kapcsolatban fog állni az e.d.-vel. Sikertelen e.d. miatt eddig sem, és ezután sem tagadjuk meg a jelenlétet! Szeretném átadni a tárggyal megcélzott tudást, de ehhez a fogadó oldalnak is készen kell állnia. Egy 7 kerdites tárgy elvégzése 210 óra hallgatói ráfordítást igényel! Kontakt óra 84 Félévközi készülés órákra 50 Felkészülés zárthelyire 26 Házi feladat elkészítése 30 Kijelölt írásos tananyag elsajátítása C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 2-20 Összesen 210 Hol tartunk? C C++ javítások OO paradigmák, objektum fogalma A C++ csupán eszköz: objektum megvalósítása osztály (egységbe zár, és elszigetel), konstruktor, destruktor, tagfüggvények alapértelmezett operátorok, és tagfüggvények operátor átdefiniálás (függvény átdefiniálás) Elegendő eszköz van már a kezünkben? C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 3 -

Konstr: létrehoz+inic. (ism.) class Komplex { double re, im; public: Komplex() { re = 0; im = 0; Komplex(double r) { re = r; im = 0; Komplex(double r, double i) { re = r; im = i; double abs() { return sqrt(re*re+im*im);... ; Komplex k; // paraméter nélküli (default) Komplex k1(1); // 1 paraméteres Komplex k2(1, 1); // 2 paraméteres C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 4 - Inicializáló lista class Valami { const double c1 = 3.14; // inicializálni kell, de hogyan? Komplex k1; public: Valami(double c) { c1 = c Valami(double c) :c1(c) { Valami(double c, Komplex k) :c1(c), k1(k) { ; Formálisan konstruktor hívás Konstans tag, és referencia tag, csak inicializáló listával inicializálható. Célszerű a tagváltozókat is inicializáló listával inicializálni (felesleges műveletek elkerülése). C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 5 - Destruktor: megszüntet (ism.) class String { unsigned int len; // tároljuk a hosszt Data; // pointer az adatara public: String(int l) { pdata = new int[len = l]; // terület lefoglalása. ~String() { delete[] pdata; // terület felszabadítása ; A pdata és a len megszüntetése automatikus, ahogy egy lokális változó is megszűnik. A new-val foglalt dinamikus terület felszabadítása azonban a mi feladatunk, ahogyan C-ben is fel kell szabadítani a dinamikusan foglalt területet. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 6 -

Műveletekkel bővített Komplex (ism.) class Komplex { double re, im; public:... Komplex operator+(const Komplex& k) { Komplex sum(k.re + re, k.im + im); return(sum); Komplex operator+(const double r) { return(operator+(komplex(r))); ;... Komplex k1, k2, k3; k1 + k2; k1 + 3.14; k1 = k2; 3.14 + k1; // bal oldal nem osztály! // Ezért globális függvény kell! Alapértelmezett C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 7 - double + Komplex (ism.) class Komplex {... ; Globális fv., nem tagfüggvény: Komplex operator+(const double r, const Komplex& k) { return(komplex(k.re + r, k.im)); Baj van! Nem férünk hozzá, mivel privát adat! 1. megoldás: privát adat elérése pub. fv. használatával: Komplex operator+(const double r, const Komplex& k) { return(komplex(k.getre() + r, k.getim())); Publikus lekérdező függvény C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 8-2. megoldás: védelem enyhítése Szükséges lehet a privát adatok elérése egy globális, függvényből, vagy egy másik osztály tagfüggvényéből. Az ún. barát függvények hozzáférhetnek az osztály privát adataihoz. Rontja az átláthatóságot és gyengíti az egységbezárás elvét, ezért nem kedveljük. class Komplex {... public: // FONTOS! Ez nem tagfüggvény, csak így jelöli, hogy barát friend Komplex operator+(const double r, const Komplex& k); ; Komplex operator+(const double r, const Komplex& k) { k.re... k.im... // hozzáfér a privát adatohoz C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 9 -

Alapértelmezett tagfüggvények (ism.) Konstruktor default: X() // nincs paramétere másoló: X(const X&) // referencia paraméter Destruktor operator=(const X&) // értékadó operator&() // címképző operator*() // dereferáló operator->() // tag elérése pointerrel operator,(const X&) // vessző A másoló konstruktor és az értékadó operátor alapértelmezés szerint meghívja az adattagok megfelelő tagfüggvényét. Alaptípus esetén (bitenként) másol! C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 10 - Példa: Intelligens string String tárolására alkalmas objektum, ami csak annyi helyet foglal a memóriában, amennyi feltétlenül szükséges. dinamikus adatszerkezet Műveletei: létrehozás, megszüntetés indexelés: [] másolás: = összehasonlítás: == összefűzés: (String + String), (String + char) (char + String) kiírás: cout << beolvasás: cin >> C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 11 - String adatszekezete int len H E L L O \0 dinamikus memória (heap) C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 12 -

String osztály class String { ; unsigned int len; public: String(const char *s = "") { p = new char[(len = strlen(s)) + 1]; strcpy(p, s); ; Ez a default konstruktor is new[] után ~String( ) { delete[] p; csak így char& operator[] (int i) { return p[i]; const char& operator[] (int i) const { return p[i]; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 13 - Függvényhívás mint balérték int main ( ) { String s("hello"); const String cs("konstans"); char c = s[3]; // c = s.operator[](3); c=p[3]; c = cs[4]; // c = cs.operator[](4) const; c=p[4]; s[1]= u'; // s.operator[](1) =' u'; p[1]='u'; // destruktor: delete[] p return 0; // destruktor cs-re, majd az s-re C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 14 - Értékadás problémája / 2 { String s1("baj"); String s2("van!"); s1 baj\0 int len = 3 s2 int len = 43 s2 = s1; van!\0 // destruktor baj -ra 2x, van -ra 0x C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 15 -

Paraméterként kapja azt, amit értékül class String { kell adni egy létező objektumnak.... String& operator=(const String& s) { // s1=s2=s3 miatt ; Megoldás: operátor= átdefiniálása if (this!= &s ) { // s = s kivédésére delete[] p; p = new char[(len = s.len) + 1]; strcpy(p, s.p); return *this; // visszaadja saját magát C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 16 - operator=-vel már nincs baj { String s1("baj"); String s2("van!"); s1 baj\0 int len = 3 s2 int len = 43 s2 = s1; van!\0 baj\0 // destruktorok rendben C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 17 - Kezdeti értékadás problémája { String s1("baj"); String s2 = s1; s1 s2 int len = 3 int len = 3 baj\0 // destruktorok baj -ra 2x C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 18 -

Megoldás: másoló konstruktor Referenciaként kapja azt a példányt, amit lemásolva létre kell hoznia egy új objektumot. class String {... String(const String& s) { p = new char[(len = s.len) + 1]; strcpy(p, s.p); C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 19 - Másoló konstruktorral már jó { String s1("baj"); String s2 = s1; s1 s2 int len = 3 int len = 3 baj\0 baj\0 // destruktorok rendben C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 20 - Miért más mint az értékadás? A kezdeti értékadáskor még inicializálatlan a változó (nem létezik), ezért nem lehet a másolással azonos módon kezelni. Mikor hívódik a másoló konstruktor? inicializáláskor (azonos típussal inicializálunk) függvény paraméterének átadásakor függvény visszatérési értékének átvételekor ideiglenes változók összetett kifejezésekben kivétel átadásakor C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 21 -

Függvényhívás és visszatérés Hívás s0 -> s (verem) Hívott String s0, s1; s1 = f (s0); tmp r -> tmp String f ( String s ) { String r;... return r; r, s C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 22 - Összetett algebrai kifejezés String s, s0, s1, s2; s = s0 + s1 + s2; 1. lépés: tmp1=s0+s1 2. lépés: 3. lépés: 4. lépés: tmp2=tmp1+s2 s = tmp2 tmp1, tmp2 megszüntetése destruktor hívással C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 23 - String rejtvény class String { ; unsigned int len; public: String( ); // 1 String(char *); // 2 String(const String&); // 3 ~String( ); // 4 String operator+(string&); // 5 char& operator[](int); // 6 String& operator=(string&);// 7 ; int main( ) { String s1("rejtvény"); String s2; String s3 = s2; char c = s3[3]; s2 = s3; s2 = s3 + s2 + s1; return 0; // destr. 2 1 3 6 7 5,3,5,3, (3),7,4,4,(4) 4,4,4 C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 24 -

String rejtvény/2 class String { ; unsigned int len; public: String( ); // 1 String(char *); // 2 String(const String&); // 3 ~String( ); // 4 String operator+(string&); // 5 char& operator[](int); // 6 String& operator=(string); // 7 ; int main( ) { String s1("rejtvény"); 2 String s2; 1 String s3 = s2; 3 char c = s3[3]; 6 s2 = s3; 3,7,4 s2 = s3 + s2 + s1; 5,3,5,3, (3),3,7,4,4,4,(4) return 0; // destr. 4,4,4 C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 25 - Miért referencia? Miért kell referencia a másoló konstruktorhoz? A paraméterátadás definíció szerint másoló konstruktort hív. Ha a másoló konstruktor nem referenciát, hanem értéket kapna, akkor végtelen ciklus lenne. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 26 - Miért fontos a delete[]? String *st = new String[3]; st[0] st[1] st[2] int len = 0 int len = 0 int len = 0 A delete st hatására csak a *st, azaz az st[0] destruktora hívódik meg! Az st[1] és az st[2] által foglalt memória nem szabadul fel! A delete[] meghívja minden elem destruktorát. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 27 - \0 \0 \0

Védelem enyhítése Nem tagfüggvény! String + class String {... String operator+(const String& s); String operator+(char c); friend String operator+(char c, const String& s); ; String operator+(char c, const String& s) { = new char[s.len + 2]; *p = c; strcpy (p+1, s.p); String ret(p); delete[] p; return ret; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 28 - Keletkezett-e +=? Az alaptípusokra meghatározott műveletek közötti logikai összefüggések nem érvényesek a származtatott típusokra. Azaz az operator= és az operator+ meglétéből nem következik az operator += Ha szükség van rá, definiálni kell. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 29 - Változtatható viselkedés Feladat: "Varázsütésre" az összes String csupa nagybetűvel íródjon ki! Megoldás: viselkedést befolyásoló jelző, de hol? objektum állapota (adata) csak az adott példányra van hatása. globális változó elég ronda megoldás! az osztályhoz rendelt állapot: statikus tag ill. tagfüggvény. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 30 -

Statikus tag Az osztályban statikusan deklarált tag nem példányosodik. Pontosan egy példány létezik, amit explicit módon definiálni kell (létre kell hozni). Minden objektum ugyanazt a tagot éri el. Nem szükséges objetummal hivatkozni rá. pl: String::SetUcase(true); Statikus tagként az osztály tartalmazhatja önmagát. Felhasználás: globális változók elrejtése C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 31 - String statikus taggal class String { ; int size; static bool ucase; // statikus tag deklarálása public:... static bool SetUcase(bool b = true) { bool prev = ucase; ucase = b; return (prev); friend ostream& operator<<(ostream& os, String& s); ; bool String::ucase = false; // FONTOS: létre kell hozni!! C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 32 - String statikus taggal /2 ostream& operator<<(ostream& os, String& s) { for (i = 0; i < s.len; i++) { char ch = s.ucase? toupper(s.p[i]) : s.p[i]; os << ch; // miért kell ch? return os; Osztályhoz tartozik, nem a példányhoz C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 33 -

Komplex példa újból Olvassunk be adott/tetszőleges számú komplex számot és írjuk ki a számokat és abszolút értéküket fordított sorrendben! Objektumok: Komplex, KomplexTar konstruktorban adott a méret: a) változat igény szerint változtatja a méretét: b) változat Mindkét megoldás dinamikus memóriakezelést igényel. Ügyelni kell a helyes felszabadításra, foglalásra. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 34 - KomplexTar osztály class KomplexTar { Komplex *t; // pointer a dinamikusan foglalt tömbre int db; // elemek száma/ tömb mérete public: class Tar_Hiba {; // osztály az osztályban a hibakezeléshez KomplexTar(int m = 10) :db(m) { t = new Komplex[m]; // konstruktor (def = 10) KomplexTar(const KomplexTar& kt);// másoló konstruktor Komplex& operator[](unsigned int i);// indexelés Komplex& operator[](unsigned int i) const ;// indexelés KomplexTar& operator=(const KomplexTar& kt); // értékadás ~KomplexTar() { delete[] t; // felszabadítás ; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 35 - KomplexTar osztály/2 KomplexTar::KomplexTar(const KomplexTar& kt) {//másoló konst. t = new Komplex[db = kt.db]; for (int i = 0; i < db; i++) t[i] = kt.t[i]; // miért nem memcpy? A memcpy nem hívná meg a konstruktort KomplexTar& KomplexTar::operator=(const KomplexTar& kt) {// = if (this!= &kt) { delete[] t; t = new Komplex[db = kt.db]; for (int i = 0; i < db; i++) t[i] = kt.t[i]; // miért nem memcpy? return *this; Visszavezettük értékadásra KomplexTar::KomplexTar(const KomplexTar& kt){//másoló 2.vált. t = NULL; *this = kt; // trükkös, de rendben van! C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 36 -

a) Indexelés és a főprogram Komplex& KomplexTar::operator[](unsigned int i) { if (i >= db) throw Tar_Hiba(); return t[i]; int main() { KomplexTar t(5); // a tárolóban 5 elemünk van try { for (int i = 0; i < 20; i++) cin >> t[i]; // beolvasás KomplexTar t2 = t1; // másoló konstruktor for (i = 19; i >= 0; i--) cout << t[i] ' ' << (double)t[i] << endl; // kiirás catch (KomplexTar::Tar_hiba) { cerr << "Indexelesi hiba\n"; // hibakezelés return(0); C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 37 - b) Változó méretű KomplexTar // Indexelés hatására növekszik a méret, ha kell Komplex& KomplexTar::operator[](unsigned int i) { if (i >= db) { // növekednie kell, célszerű kvantumokban Komplex *tmp = new Komplex[i+10]; // legyen nagyobb for (int j = 0; j < db; j++) tmp[j] = t[j]; // átmásol delete[] t; // régi törlése t = tmp; // pointer az új területre db = i + 10; // megnövelt méret return t[i]; // referencia vissza // Konstans tároló nem tud növekedni Komplex& KomplexTar::operator[](unsigned int i) const { if (i >= db) throw Tar_Hiba(); return t[i]; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 38 - c) Gyakorlatiasabb változat class KomplexTar { static const unsigned int nov = 3; // növekmény érteke Komplex *t; // pointer a dinamikusan foglalt adatra unsigned int db; // elemek száma unsigned int kap; // tömb kapacitása public: KomplexTar(int m = 10) :db(m), kap(m+nov) { t = new Komplex[kap]; KomplexTar(const KomplexTar&); unsigned int capacity() const { return kap; unsigned int size() const { return db; Komplex& operator[](unsigned int i); Komplex& operator[](unsigned int i) const ; KomplexTar& operator=(const KomplexTar&);... C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 39 -

c) Gyakorlatban használhatóbb Komplex& KomplexTar::operator[](unisgned int i) { if (i >= kap) { Komplex *tmp = new Komplex[i+nov]; // legyen nagyobb for (unsigned int j = 0; j < db; j++) tmp[j] = t[j]; // átmásol delete[] t; // régi törlése t = tmp; // pointer az új területre kap = i + nov; // megnövelt kapacitás if (i >= db) db = i+1; // megnövelt darab return t[i]; // referencia vissza Komplex& KomplexTar::operator[](unsigned int i) const { if (i >= db) throw Tar_Hiba(); return t[i]; http://svn.iit.bme.hu/proga2/eloadas_peldak/ea_03/ C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 40 - Összefoglalás /1 INICIALIZÁLÁS!= ÉRTÉKADÁS Inicializáló lista szerepe. Alapértelmezett tagfüggvények. Dinamikus szerkezeteknél nagyon fontos a másoló konstruktor és az értékadás felüldefiniálása. (nem maradhat alapért.) Default konstruktornak fontos szerepe van a tömböknél. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 41 - Összefoglalás /2 Konstans tagfüggvények nem változtatják az objektum állapotát. Statikus tag és tagfüggvény az osztályhoz tartozik. Védelem enyhítése: friend Létrehozás, megsemmisítés feladatait a konstruktor és destruktor látja el. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 42 -

Létrehozás, megsemmisítés Konstruktor default: X() // nincs paramétere automatikusan létrejön, ha nincs másik konst. másoló: X(const X&) // referencia paramétere van, automatikusan létrejön: meghívja az adattagok másoló konst.-rát, ha objektumok, egyébként bitenként másol. Destruktor delete[ ] // [ ] nélkül csak a 0. tömbelemre!! automatikusan létrejön: meghívja az adattagok destr. operator=(const X&) // értékadó operátor automatikusan létrejön: meghívja az adattagok értékadó operátorát, ha objektumok, egyébként bitenként másol. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 43 - Milyen furcsa kommentek! A kommentekből automatikusan generál dokumentációt a Doxygen program. (html, latex, rtf, man,... formátumban) Csak jó kommentből lesz jó dokumentáció! Speciális kezdet /** Rövid leírás ponttal zárva * Komplex osztály. * Komplex viselkedést megvalósító osztály. Részletesebb * Csak a feladat megoldásához szükséges műveleteket definiáltuk. leírás */ class Komplex { C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 44 - Milyen furcsa kommentek! /2 Speciális kezdet /** Rövid leírás ponttal zárva * Komplex osztály. * Komplex viselkedést megvalósító osztály. * Csak a feladat megoldásához szükséges műveleteket definiáltuk. */ class Komplex { Részletesebb leírás C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 45 -

Milyen furcsa kommentek! /3 class Komplex { Paraméterek dokumentálása... /** * Konstruktor nulla, egy és két paraméterrel Speciális kezdet * @param r - valós rész (alapértelmezése 0) * @param i - képzetes rész (alapértelmezése 0) */ Komplex(double r = 0, double i = 0) :re(r), im(i) { Rövid leírás operator double() { return sqrt(re*re + im*im); ///< abszolút érték friend istream& operator>>(istream& s, Komplex& k) ; ///< Komplex beolvasás friend ostream& operator<<(ostream& s, const Komplex k); ///< Komplex kiírás C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 46 - Tesztelési követelmények Legyen független, és megismételhető Legyen áttekinthető és tükrözze a tesztelt kód struktúráját. Legyen hordozható és újrafelhasználható. Segítsen a teszt írójának a problémára koncentrálni. Legyen gyors és automatizálható. Gyakran a tárolóba (svn) való betétel feltétele az ún. unit teszt sikeressége. C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 47 - Google Test Kis méretű, forráskódban elérhető http://code.google.com/p/googletest/ Platformfüggetlen (WinX, MAC, LINUX, Windows Mobile, MinGW, ) Assertion alapú success, nonfatal, fatal Teszt program: teszt esetek tesztek C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 48 -

Assertion Hasonlító függvényeket hívnak Hiba esetén kiírják a hiba helyét, kódját ASSERT_* fatális hiba a program megáll EXPECT_* nem fatális hiba tovább fut ASSERT_EQ(4, 2*2) << "2*2 hiba"; for (int i = 0; i < 10; i++) { EXPECT_LT(i-1, 2*i) << "i nem kisebb mint 2*i! i=" << i; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 49 - Egyszerű feltételek Utasítás ASSERT_EQ(expected, actual) ASSERT_NE(val1, val2) ASSERT_LT(val1, val2) ASSERT_LE(val1, val2) ASSERT_GT(val1, val2) ASSERT_GE(val1, val2) ASSERT_STREQ(exp_str, act_str) ASSERT_STRNE(str1, str2); ASSERT_STRCASEEQ(exp, act); ASSERT_STRCASENE(str1, str2) Teljesülnie kell expected == actual val1!= val2 val1 < val2 val1 <= val2 val1 > val2 val1 >= val2 a két C string azonos a két C string nem azonos a két C string azonos (kis/nagy betű az.) a két C string nem azonos (kis/nagy b.) C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 50 - Egyszerű példa #include "gtest/gtest.h" #include "komplex.h" TEST(KomplexTeszt, ValosReszVizsgalata) { const Komplex k1(3, 1); EXPECT_EQ(3, k1.getre ()) << "Valos rész nem OK!"; TEST(KomplexTeszt, KepzetesReszVizsgalata) { const Komplex k1(3, 2); ASSERT_EQ(2, k1.getim ()) << "Képzetes rész nem OK!"; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 51 -

Problémák a HSZK-ban VS ingyenes változatával nem fordul (tuple par.) CB-vel rendben, van de érzékeny a jó lib-re. include win32 gtest.lib, gtest_main-mdd.lib (Visual Studio-hoz) libgtestd.a, libgtest_maind.a (CodeBloks-hoz) További beállításokra lehet szükség: Projektfájlban a megfelelő útnév beállítása: CB: Project ->Build options ->Linker settings, Search directories VS: Project-> Properties -> C++ -> General (additional dir), Project-> Properties -> linker -> Input (Additional dep.) C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 52 - gtest_lite A prog2 tárgyhoz készült. Lényegében a gtest fontosabb lehetőségeit valósítja meg kompatibilis módon. Ronda makrókkal és statikus objektummal operál. HF-ben használható ill. használandó. Csak egyszerű teszteket támogat C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 53 - gtest_lite példa #include "gtest_lite.h" #include "komplex.h" int main() { TEST(KomplexTeszt, ValosReszVizsgalata) { const Komplex k1(3, 1); EXPECT_EQ(3, k1.getre ()) << "Valos rész nem OK!"; END TEST(KomplexTeszt, KepzetesReszVizsgalata) { const Komplex k1(3, 2); ASSERT_EQ(2, k1.getim ()) << "Képzetes rész nem OK!"; END return 0; C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 54 -

További ellenőrzések Utasítás ASSERT_THROW(statement, excep_type) ASSERT_ANY_THROW(statement) ASSERT_NO_THROW(statement) ASSERT_PRED_FORMAT1(pred, val1) ASSERT_PRED_FORMAT2(pred, val1, val2) ASSERT_FLOAT_EQ(expected, actual) ASSERT_DOUBLE_EQ(expected, actual) ASSERT_NEAR(val1, val2, abs_error) SUCCEED() FAIL(); ADD_FAILURE() ADD_FAILURE_AT("file_path", line_number); Teljesülnie kell adott típust dobnia kell bármit kell dobnia nem dobhat pred(val1) == true pred(val1, val2) == true expected ~= actual expected ~= actual abs(val1-val2) <= abs_error siker végzetes; nem végzetes nem végzetes C++ programozási nyelv BME-IIT Sz.I. 2017.02.21. - 55 -