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

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

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

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

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.

Objektumok inicializálása

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

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)

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

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

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 II gyakorlat. 8. Operátor túlterhelés

3. Osztályok II. Programozás II

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. (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 módszertan

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

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

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

- 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]++;

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

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

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

C++ programozási nyelv Konstruktorok-destruktorok

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

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

Globális operátor overloading

Java II. I A Java programozási nyelv alapelemei

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

C++ programozási nyelv

117. AA Megoldó Alfréd AA 117.

1. Alapok. Programozás II

OOP #14 (referencia-elv)

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

Java II. I A Java programozási nyelv alapelemei

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

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

Pénzügyi algoritmusok

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

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.

Programozás C++ -ban 2007/7

500. AA Megoldó Alfréd AA 500.

500. CC Megoldó Alfréd CC 500.

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)

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

AA MEGOLDÓ ALADÁR AA

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

Informatika terméktervezőknek

Osztályok. 4. gyakorlat

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

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

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

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

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

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Elemi Alkalmazások Fejlesztése II.

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

.AA Megoldó Alfréd AA.

Programozás II gyakorlat. 6. Polimorfizmus

128. AA Megoldó Alfréd AA 128.

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

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

Programozás C++ -ban

Alprogramok, paraméterátadás

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

Java és web programozás

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

Bevezetés a C++ programozási nyelvbe

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

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

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

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.

Mit ír ki? feladatok megoldásokkal

5. Gyakorlat. struct diak {

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

Maximum kiválasztás tömbben

228. AA Default Konstruktor AA 228.

Java és web programozás

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

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

Osztály és objektum fogalma

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

A C programozási nyelv I. Bevezetés

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

A C programozási nyelv I. Bevezetés

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

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

Szoftvertechnológia alapjai Java előadások

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.

Programozás C és C++ -ban

Á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. 2016.03.01. - 1 -

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. 2016.03.01. - 2 -

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. 2016.03.01. - 3 -

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. 2016.03.01. - 4 -

Destruktor: megszüntet (ism.) class Dinamikus { int *pdata; // pointer valamilyen adatara double value; // valamilyen másik adat public: Dinamikus(int len) { pdata = new int[len]; // terület lefoglalása. } ~Dinamikus() { delete[] pdata; } // terület felszabadítása }; A pdata és a value 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. 2016.03.01. - 5 -

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. 2016.03.01. - 6 -

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. 2016.03.01. - 7 -

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 áttekinthetőséget, 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. 2016.03.01. - 8 -

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. 2016.03.01. - 9 -

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. 2016.03.01. - 10 -

String adatszekezete char *p int size H E L L O \0 dinamikus memória (heap) C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 11 -

String osztály class String { char *p; unsigned int size; public: String(const char *s = "") { p = new char[(size = 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. 2016.03.01. - 12 -

Függvényhívás mint balérték 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 } // destruktor cs-re, majd az s-re C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 13 -

Értékadás problémája / 2 { String s1("baj"); String s2("van!"); s1 s2 char *p int size = 3 char *p int size = 34 s2 = s1; baj\0 van\0 } // destruktor baj -ra 2x, van -ra 0x C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 14 -

class String {... String& operator=(const String& s) { // s1=s2=s3 miatt }; } Megoldás: operátor= átdefiniálása if (this!= &s ) { // s = s miatt delete[] p; p = new char[(size = s.size) + 1]; strcpy(p, s.p); } return *this; Paraméterként kapja azt, amit értékül kell adni egy létező objektumnak. // visszaadja saját magát C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 15 -

Kezdeti értékadás problémája { String s1("baj"); String s2 = s1; s1 char *p int size = 3 baj\0 s2 char *p int size = 3 } // destruktor baj -ra 2x C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 16 -

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[(size = s.size) + 1]; strcpy(p, s.p); } } C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 17 -

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. 2016.03.01. - 18 -

Függvényhívás és visszatérés Hívás String s0, s1; s1 = f (s0); tmp s0 -> s (verem) r -> tmp Hívott String f ( String s ) { String r;... return r; } r, s C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 19 -

Ö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. 2016.03.01. - 20 -

String rejtvény class String { char *p; int size; public: String( ); // 1 String(char *); // 2 String(String&); // 3 ~String( ); // 4 String operator+(string&); // 5 char& operator[](int); // 6 String& operator=(string&);// 7 }; main( ) { String s1("rejtvény"); String s2; String s3 = s2; char c = s3[3]; s2 = s3; s2 = s3 + s2 + s1; } // 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. 2016.03.01. - 21 -

String rejtvény/2 class String { char *p; int size; public: String( ); // 1 String(char *); // 2 String(String&); // 3 ~String( ); // 4 String operator+(string&); // 5 char& operator[](int); // 6 String& operator=(string); // 7 }; 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) } // destr. 4,4,4 C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 22 -

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. 2016.03.01. - 23 -

Miért fontos a delete[]? String *st = new String[3]; char *p st[0] int size = 0 st[1] char *p int size = 0 st[2] char *p int size = 0 \0 \0 \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. 2016.03.01. - 24 -

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) { char *p = new char[s.size + 2]; *p = c; strcpy (p+1, s.p); String ret(p); delete[] p; return ret; } C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 25 -

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. 2016.03.01. - 26 -

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. 2016.03.01. - 27 -

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. 2016.03.01. - 28 -

String statikus taggal class String { char *p; 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. 2016.03.01. - 29 -

String statikus taggal /2 ostream& operator<<(ostream& os, String& s) { for (i = 0; i < s.size; 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. 2016.03.01. - 30 -

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 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. 2016.03.01. - 31 -

KomplexTar osztály class KomplexTar { Komplex *t; // pointer a dinamikusan foglalt tömbre int db; // tömb mérete (elemek száma) 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[](int i); // indexelés KomplexTar& operator=(const KomplexTar& kt); // értékadás ~KomplexTar() { delete[] t;} // felszabadítás }; C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 32 -

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. 2016.03.01. - 33 -

Indexelés és a főprogram (a,) Komplex& KomplexTar::operator[](int i) { if (i >= db i < 0) 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. 2016.03.01. - 34 -

Változó méretű KomplexTar (b,) // Indexelés hatására növekszik a méret, ha kell Komplex& KomplexTar::operator[](int i) { if (i < 0) throw Tar_Hiba(); // hibás indexelés 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 C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 35 -

Ö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. 2016.03.01. - 36 -

Ö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. 2016.03.01. - 37 -

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. 2016.03.01. - 38 -

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. * Csak a feladat megoldásához szükséges műveleteket definiáltuk. Részletesebb leírás */ class Komplex { C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 39 -

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. 2016.03.01. - 40 -

Milyen furcsa kommentek! /3 class Komplex {... /** * Konstruktor nulla, egy és két paraméterrel * @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) {} Paraméterek dokumentálása Speciális kezdet 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. 2016.03.01. - 41 -

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. 2016.03.01. - 42 -

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. 2016.03.01. - 43 -

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(2*2, 4) << "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. 2016.03.01. - 44 -

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. 2016.03.01. - 45 -

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. 2016.03.01. - 46 -

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. 2016.03.01. - 47 -

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. 2016.03.01. - 48 -

gtest_lite példa #include "gtest_lite.h" #include "komplex.h" 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 C++ programozási nyelv BME-IIT Sz.I. 2016.03.01. - 49 -

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. 2016.03.01. - 50 -