Documente Academic
Documente Profesional
Documente Cultură
Dorel Lucanu
Dorel Lucanu
Bibliografie
! Liviu Negrescu : Limbajele C si C++ pentru incepatori, vol II, III, Microinformatica, ClujNapoca ! H. Schildt: C++ manual complet, Teora, 2000 ! D. Kaler, M.J. Tobler, J. Valter: C++, Teora, 2000 ! Bjarne Stroustrup: The C++ Programming Language, Adisson-Wesley, 3nd edition, 1997 ! Stanley B. Lippman: C++ Primer, Addison Wesley, 1992 Manuale electronice ! Peter Mller : Introduction to Object-Oriented Programming Using C++ ! Bruce Eckel : Thinking in C++, 2nd Edition ! *** : Online C++ tutorial
Dorel Lucanu
Curs 1 ! Incapsulare si ascundere "Clase si obiecte, clase atribute, metode, stari declararea claselor si obiectelor in C++ utilizarea obiectelor in C++ constructori, destructori exemplul Contor: .h, .cpp, demo "Tipuri abstracte de data si obiecte Exemplul Stiva: .h, .cpp, demo "Utilizare de clase: string.h, string.cpp
Dorel Lucanu
Obiecte si clase
! O prima definitie pentru obiecte si clase: " Un obiect este caracterizat de: nume atribute o multime de stari metode (servicii) " O clasa descrie unul sau mai multe obiecte ce pot fi precizate printr-un set uniform de atribute si metode. ! Reprezentarea grafica
Dorel Lucanu
Clasa Contor Un contor are o valoare curenta si o valoare de resetare, si poate fi incrementat, decrementat, resetat, si pot fi citite valorile curenta si de resetare
Contor
val : int reset_val : int
Dorel Lucanu
Incapsulare si ascundere
! Incapsulare: datele si operatiile asupra lor sint incluse in aceeasi unitate sintactica (clasa)
!Ascunderea informatiei modul de structurare a datelor nu este cunoscut actiunile asupra datelor sint realizate numai prin operatiile (metodele) clasei si anumite actiuni pot fi ascunse
Dorel Lucanu
Contor.h
class Contor { public: // Constructori/destructori Contor(); ~Contor(); // metode int get_val(); int get_reset_val(); void increment(); void decrement(); void reset() { val = val_reset; } private: // atribute int val; int val_reset; };
Dorel Lucanu
Contor.cpp
#include "contor.h" Contor::Contor() { val = 0; val_reset = 0; } void Contor::increment() { val++; } void Contor::decrement() { val--; }
Contor_demo.cpp
Contor intcount; intcount.increment(); cout << intcount.get_val;
Dorel Lucanu Programarea calculatoarelor (C++) 8
Dorel Lucanu
stiva ! tipul de data abstract Stiva " entitati de tip data: liste FIFO " operatii # push() # pop() # top()
Dorel Lucanu
10
Stiva.h
#define MAX_STIVA 10 class Stiva { public: Stiva(); ~Stiva(); void push(char); void pop(); char top(); bool este_vida(); private: char tab[MAX_STIVA]; int virf; };
Dorel Lucanu
11
Stiva.cpp
Stiva::Stiva() { virf = -1; } void Stiva::push(char c) { if (virf == MAX_STIVA-1) throw "Depasire superioara."; tab[++virf] = c; } void Stiva::pop() { if (virf < 0) throw "Depasire inferioara."; virf--; } char Stiva::top() { if (virf < 0) throw "Depasire inferioara."; return tab[virf]; }
Dorel Lucanu Programarea calculatoarelor (C++) 12
Stiva_demo
#include <iostream.h> #include "stiva.h" void main(void) { Stiva S; char c='a'; try { while (true) { S.push(c++); cout << S.top() << endl; } } catch (char *mes_err) { cout << mes_err << endl; } }
Dorel Lucanu
13
my_string.h
Dorel Lucanu
class string { public: // Constructori/destructori string(); string(char* new_string); string(const string& new_string); . . . ~string(); // operatii int size() const; const char* c_str() const; friend string operator+ (const string& lhs, const string& rhs); string& operator= (const string& a_string); friend ostream& operator<< (ostream& os, const string& a_string); . . . private: char* char_arr; int string_length; };
14
my_string.h - utilizare
string s1(123); string s2; s2 = string("abc") + s1; s1 = s2 ; string s3(s2); s1 = "armata"; b = (s1 == s2);
Dorel Lucanu
15
Curs 2
! De la C la C++ " comentarii cu // " Conversii de tip (type casting) " intrari/iesiri cu cin >> si respectiv cout << (c2cpp1.cpp, c2cpp10.cpp, c2cpp11.cpp,) " fisiere intrare/iesire (c2cpp10.cpp) " declaratii variabile (c2cpp2.cpp, c2cpp3.cpp) " apel prin referinta (c2cpp4.cpp) " functii care intorc variabile (c2cpp4.cpp) " functii inline (c2cpp5.cpp) " exceptii (c2cpp6.cpp)
Dorel Lucanu
16
De la C la C++ (-1)
! Conversii de tip (type casting) " in C: int n; float x; x = (float) n; " in C++: int n; float x; x = float(n); ! Intrari iesiri // introducerea unui numar int nr; char s[100]; cout << "Numar>"; cin >> nr; // introducerea unui sir cout << "Sir> "; cin >> s;
Dorel Lucanu
17
De la C la C++ (0)
! fisiere intrare/iesire // varianta 1 (nu prea OK) char c; ifstream f_inp("c2cpp10.cpp"); ofstream f_out("c2cpp10.cp1"); if (f_out && f_inp) while (f_inp >> c) f_out << c; // varianta 2 (mai fidela) ifstream f_inp("c2cpp10.cpp"); ofstream f_out("c2cpp10.cp2"); if (f_out && f_inp) while (f_inp.get(c)) f_out << c; // varianta 3 fstream f_inp; fstream f_out; f_inp.open("c2cpp11.cpp", ios::in); f_out.open("c2cpp11.cp1", ios::out); if (f_out && f_inp) while (f_inp.get(c)) f_out << c; f_inp.close(); f_out.close();
Dorel Lucanu Programarea calculatoarelor (C++) 18
De la C la C++ (I)
! variabilele se pot declara oriunde int a; a = 10; cout << a << endl; // afiseaza 10 { double a, b = 2.0; a = 3.14 * b; cout << a << endl; // afiseaza 6.28 } a *= 3; cout << a << endl; // afiseaza 30 ! variabile declarate in interiorul unui ciclu for for(int i=0; i<4; i++) { int a = i; a *= 10; cout << a << endl; } cout << i; // OK (sau warning) cout << a; // EROARE
Dorel Lucanu
19
De la C la C++ (II)
! variabilele globale pot fi accesate chiar daca sint ascunse double a = 10.0; void main(void) { char *a = "zece"; cout << "a local = " << a << endl; cout << "a global = " << ::a << endl; } ! variabile cu mai multe nume (alias-uri) double x = 3.1415927; double& y = x; // y face referire la x y = 23.45; cout << x << endl; // afiseaza 23.45
Dorel Lucanu
20
De la C la C++ (III)
! apel prin referinta void swap (int& x, int& y) { int aux = x; x = y; y = aux; } ! o functie poate returna o variabila float& var_max(float& x, float& y) { if (x > y) return x; else return y; }
Dorel Lucanu
21
De la C la C++ (IV)
! daca nu-ti plac pointerii: double *p; p = new double; *p = 5.0; double& x = *p; x *= 2.0; cout << *p << " este acelasi cu " << x << endl; ! functii inline inline double ipot(double a, double b) { return sqrt(a*a + b*b); };
Dorel Lucanu
22
De la C la C++ (V)
! functii inline (continuare) class Data { public: int zi() { return z; } // ... private: int z, l, a; }; este echivalenta cu class Data { public: int zi(); // ... private: int z, l, a; }; inline int Data::zi() { return z; }
Dorel Lucanu Programarea calculatoarelor (C++) 23
De la C la C++ (VI)
! exceptii int add(int a, int b) { if ((b > 0) && (a > INT_MAX-b)) throw "Depasire superioara"; if ((b < 0) && (a < INT_MIN-b)) throw "Depasire inferioara"; return a+b; } int x,y; cout << "Introduceti x si y: "; cin >> x >> y; try { cout << "Suma este " << add(x, y) << endl; } catch (char *err) { cout << "EROARE: " << err;
Dorel Lucanu
24
De la C la C++ (VII)
! exceptii (continuare) int nr; cout << "Numar> "; cin >> nr; cout << endl; try { if (nr == 0) throw "zero"; if (nr == 1) throw "unu"; if (nr % 2 == 0) throw "par"; for (int i = 3; i < sqrt(nr); i++) if (nr % i == 0) throw "neprim"; throw "prim"; } catch (char *concluzie) { cout << " Numarul introdus este " << concluzie; cout << endl;
Dorel Lucanu
25
Curs 3
! De la C la C++ (continuare) " exceptii vs assert() " parametri impliciti " supraincarcarea operatorilor (c2cpp7.cpp, c2cpp9.cpp) " template-uri (c2cpp8.cpp, meniu1.h, contor-m1.h, container.h, container_contor1.cpp) " alocare dinamica (string.h) " Structuri (c2cpp12.cpp)
Dorel Lucanu
26
De la C la C++ (VII+1)
! exceptii vs assert() void Stiva::push(char c) { if (virf < -1 || virf >= MAX_STIVA) throw ERR:invariant."; . . . } inline void Stiva::check() {
#ifndef NDEBUG
if (virf < -1 || virf >= MAX_STIVA) throw ERR:invariant."; #endif } void Stiva::push(char c) { assert(virf <= -1 && virf<MAX_STIVA); . . . }
Dorel Lucanu
27
De la C la C++ (VII+2)
! Parametri impliciti int fct(int x=7, int y=9) { return x+y; } void main() { cout << fct() << endl; // 16 cout << fct(2) << endl; // 11 cout << fct(2, 3) << endl; // 5 } ! ce se intimpla daca mai definim o functie fct()? int fct(int x) { return 2*x; } # eroare de compilare
Dorel Lucanu Programarea calculatoarelor (C++) 28
De la C la C++ (VIII)
! supraincarcarea operatorilor struct punct { int x,y; }; punct operator * (int a, punct p) { punct q; q.x = a * p.x; q.y = a * p.y; return q; } bool operator == (punct p, punct q) { return (p.x == q.x && p.y == q.y); } //... a.x = 1; a.y = 2; b = 5 * a; cout << endl << b.x << ", " << b.y << endl; if (a == b) cout << "egal" << endl; else cout << "diferit" << endl;
Dorel Lucanu Programarea calculatoarelor (C++) 29
De la C la C++ (IX)
! supraincarcarea operatorilor (continuare) ostream& operator << (ostream& o, punct p) { o << "(" << p.x << ", " << p.y << ") "; }; //... cout << b << endl; //va scrie (5, 10) ! operatori in string.h String& operator +(const String& a_string); String& operator +=(const String& a_string); String& operator =(const String& a_string); // ... friend ostream& operator<< (ostream& os, const String& a_string); ! Supraincarcarea functiilor void swap(int& x, int& y) { int aux = x; x = y; y = aux; }
Dorel Lucanu Programarea calculatoarelor (C++) 30
De la C la C++ (X)
void swap(double& x, double& y) { tip aux = x; x = y; y = aux; } ! template-uri template <class tip> void swap(tip& x, tip& y) { tip aux = x; x = y; y = aux; } int m = 8, n = 15; swap(m, n); . . . double a = 10.0, b = 20.0; swap(a,b); . . .
Dorel Lucanu Programarea calculatoarelor (C++) 31
De la C la C++ (XI)
! template-uri (continuareI) template <class Obiect> class Meniu { public: //... void set_obiect(Obiect& obiect_nou) { obiect = &obiect_nou; } //... private: //... Obiect *obiect; } class Meniu_Contor : public Meniu<Contor> { //... }
Dorel Lucanu
32
De la C la C++ (XII)
! template-uri (continuare II) template <class Obiect> class Container { public: // ... protected: Meniu<Obiect> *meniu; Display_Box<Obiect> *displ_box; }; class Container_Contor : public Container<Contor> { // ... };
Dorel Lucanu
33
De la C la C++ (XIII)
! alocare dinamica class String { public: // Constructori/destructori String() { char_arr = new char[1]; char_arr[0] = '\0'; } String(const char* new_string); . . . ~String() { delete[] char_arr; } . . . } String::String(const char* new_string) { string_length = strlen(new_string); char_arr = new char[string_length + 1]; strcpy(char_arr, new_string); }
Dorel Lucanu Programarea calculatoarelor (C++) 34
De la C la C++ (XIV)
! alocare dinamica (continuare I) String *ps = new String("Sir alocat dinamic."); cout << *ps << endl; delete ps; cout << *ps << endl; String *ps1 = new String("Alt sir alocat dinamic."); cout << *ps << endl; String *psa = new String[5]; for (int i = 0; i<5; i++) { psa[i] = String(i); cout << psa[i] << endl; } delete[] psa;
Dorel Lucanu
35
De la C la C++ (XV)
! Structuri struct Data { int z, l, a; void init(int o_zi, int o_luna, int un_an); void aduna_an(int n); void aduna_luna(int n); void aduna_zi(int n); }; void Data::init(int o_zi, int o_luna, int un_an) { z = o_zi; l = o_luna; a = un_an; } // ... Data azi; azi.z = 20; azi.aduna_zi(6); cout << azi.z;
Dorel Lucanu Programarea calculatoarelor (C++) 36
Curs 4
! O trecere in revista a POO
"Ierarhii de clase (relatia generalizare/specializare") "Relatii de asociere intre clase "Relatia de compozitie
Dorel Lucanu
37
Generalizare/specializare I
! Sint un student: " Imi cunosc ID-ul " Imi cunosc numele " Stiu disciplinele pe care le urmez " Pot sa-mi spun ID-ul " Pot sa-mi spun numele " Pot sa ma inscriu la o noua disciplina
Dorel Lucanu
38
Generalizare/specializare II
! Sint un profesor: " Imi cunosc ID-ul " Imi cunosc numele " Stiu disciplinele pe care le predau " Pot sa-mi spun ID-ul " Pot sa-mi spun numele " Pot sa predau o noua disciplina
Dorel Lucanu
39
Specializam
! Sint un student: " Mostenesc atributele si operatiile de la Persoana " Stiu disciplinele pe care le urmez " Pot sa ma inscriu la o noua disciplina ! Sint un profesor: " Mostenesc atributele si operatiile de la Persoana " Stiu disciplinele pe care le predau " Pot sa predau o noua disciplina
Dorel Lucanu Programarea calculatoarelor (C++) 40
Generalizare/specializare IV
Dorel Lucanu
41
Generalizare/specializare in C++
class Persoana { public: Persoana(string = "", string = ""); ~Persoana(); string getNume() const; string getId() const; private: string id, nume; };
class Student : public Persoana { public: Student(string="", string=""); ~Student(); void addDiscUrmata(Disciplina*); private: Disciplina *discUrmate[MAX]; int nrDiscUrmate; };
Dorel Lucanu
-urmeaza Disciplina * 1 * * 1
-predataDe
-titular Profesor
Student
* Examen *
43
class Examen { public: . . . void addStudent(Student*); Disciplina* getDisc() const; private: Disciplina* disc; struct { Student* stud; int nota; } exam[MAX_nrStudEx]; };
Dorel Lucanu Programarea calculatoarelor (C++) 44
Relatia de compozitie
Dorel Lucanu
1 Facultate 1 1 1
0..* Examen
Student
Disciplina
45
Facultate::Facultate(int INI_stud, . . .) { nrStud = 0; MAX_nrStud = INI_stud; stud = new Student[MAX_nrStud]; if (stud == NULL) throw "Facultate: mem. heap insuf."; . . . }
Dorel Lucanu
46
Curs 5
! O trecere in revista a POO (continuare) " Comunicarea intre obiecte " Polimorfism " Clase parametrizate
Dorel Lucanu
47
Comunicarea intre obiecte Sint facultatea FII comunic profesorului P sa examineze studentii inscrisi la examenul E. Sint profesorul P examinez studentii si comunic examenului E notele acordate. Sint facultatea FII: comunic examenului E sa afiseze notele
examineaza() fii : sco::Facultate
az te lis
: sco::Profesor
: sco::Examen
Dorel Lucanu
se tN ot a( )
aN ) e( ot
mesaje
48
Mesaje in C++
void Facultate::examineaza() { . . . prof[iProf].examineaza(ex[iEx]); }; void Profesor::examineaza(Examen& unEx) const { . . . for (int i=0; i < unEx.nrStud; i++) { . . . unEx.setNota(unEx.exam[i].stud, notaStud); } } void Examen::setNota(Student* unStud, int oNota) { . . . exam[i].nota = oNota; };
Dorel Lucanu
49
Sumar ! Un obiect are abilitatea: "de a se crea "de a se distruge "de a-si regasi datele (valorile atributelor) "de a-si actualiza datele (valorile atributelor) "de a comunica cu alte obiecte prin transmiterea de mesaje
Dorel Lucanu
50
Polimorfism::suprascriere I
class Persoana { . . . void semneaza(); }; class Student : public Persoana { . . . void semneaza(); }; class Profesor : public Persoana { . . . void semneaza(); }; void Persoana::semneaza() { cout << getNume() << endl; } void Student::semneaza() { cout << "Student " << getNume() << endl; } void Profesor::semneaza() { cout << "Profesor " << getNume() << endl; }
Dorel Lucanu Programarea calculatoarelor (C++) 51
Polimorfism:: suprascriere II
Persoana p("0000", "Strainu Stefan"); Student st("1111", "Ionescu Ion"); Profesor pr("2222", "Popescu Petru"); p.semneaza(); st.semneaza(); pr.semneaza();
Dorel Lucanu
52
Dorel Lucanu
53
Polimorfism::functii virtuale
class Persoana { . . . virtual void semneaza(); }; class Student : public Persoana { . . . virtual void semneaza(); }; class Profesor : public Persoana { . . . virtual void semneaza(); };
Parametrizare I (cell.h)
template <class Elt> class Cell { public: Cell(); ~Cell(); Elt getVal(); setVal(Elt); private: Elt* val; }; template <class Elt> Cell<Elt>::Cell() { val = new Elt; } template <class Elt> Cell<Elt>::~Cell() { delete val; } template <class Elt> Elt Cell<Elt>::getVal() { return *val; } . . .
Dorel Lucanu Programarea calculatoarelor (C++) 55
Parametrizare II (demo.cpp)
Cell<int> x; x.setVal(100); Cell<char> c; c.setVal('A'); cout << "x = " << x.getVal(); cout << "c = " << c.getVal();
Dorel Lucanu
56
Curs 6
! Clase (avansat) " definitie " exemple (data.h, data.cpp, data_demo.cpp, llin.h, llin.cpp, llin_demo.cpp) " declaratie " date membre " functii membre " pointerul this " prietenii unei clase " constructori si operatorul new " destructori si operatorul delete
Dorel Lucanu
57
Clase
! definitie: " o clasa in C++ are asociate 4 tipuri de elemente: o colectie de date membre (atribute) o colectie de functii membre (metode) nivele de acces ale programului (public, private, ...) un nume " declaratie <decl_clasa> ::= class <nume_clasa> { <corp> } " Implentarea functiilor <tip> <nume_clasa> ::= <nume_functie>(<param>) {<definitie_functie} ! date membre " sint declarate ca variabile ! ascunderea informatiei class nume_clasa { public: ... private: ... } ! obiecte " sint declarate ca variabile <nume_clasa> <lista_nume_obiecte>; ! exemple: Data, LLin
Dorel Lucanu Programarea calculatoarelor (C++) 58
Clasa Data
(data.h)
class Data { public: Data(int o_zi = 1, int o_luna = 1, int un_an = 1900); ~Data() { } void aduna_zi(int n); void aduna_luna(int n); void aduna_an(int n); Data& operator ++(int); // postfix Data& operator ++(); // prefix void set_zi(int zi_noua); void set_luna(int ); void set_an(int an_nou); int get_zi() const; int get_luna() const; int get_an() const; friend ostream& operator << (ostream&, Data&); private: int zi, luna, an; };
Dorel Lucanu Programarea calculatoarelor (C++) 59
Dorel Lucanu
60
Clasa Data
#include "data.h"
(data.cpp)
Data::Data(int o_zi, int o_luna, int un_an) { zi = o_zi; luna = o_luna; an = un_an; } void Data::aduna_zi(int n) { // trebuie implementat }
void Data::aduna_an(int n) { an += n; }
Dorel Lucanu
62
Clasa Data
(data_demo.cpp)
Data azi(zi_curenta(), luna_curenta(), an_curent()); cout << azi << endl; int zz = azi.get_zi(); azi.set_zi(29); azi++; cout << azi.get_zi() << endl; azi.aduna_luna(15); cout << azi.get_luna() << ' ' << azi.get_an() << endl;
int zi_curenta() { struct tm *tp; //struct tm este definit in <time.h> time_t acum; //time_t este definit in <time.h> acum = time(NULL); tp = localtime(&acum); return tp->tm_mday; }
Dorel Lucanu
63
Clase (continuare I)
! functii membre " functii manager (constructori, destructori) Data::Data() Data::~Data() " implementori (implementeaza operatiile clasei) Data::aduna_an() Data::aduna_zi() " functii ajutatoare Llin::remove() " functii de acces Data::set_zi() Data::get_zi() ! functii membre const int Data::get_zi() const {...} int Data::get_luna() const {...} " supraincarcarea functiilor const cu functii nonconst int Data::get_zi() {...} ... const Data oZiConst(12,3,2001); Data oZi(1,4,2000); ... oZiConst.get_zi(); oZi.get_zi();
Dorel Lucanu Programarea calculatoarelor (C++) 64
Dorel Lucanu
67
Curs 7
! Clase (continuare) " membri statici " tipul unui membru " spatiul de nume si domeniul de vizibilitate ale unei clase " union " obiectele ca membre ale unei clase " functii membre care intorc referinte la date membre private?
Dorel Lucanu
68
Clase (continuare V)
! membri statici: numararea obiectelor create #include <iostream.h> class A { public: A() { nr_instante++; } ~A() { } int get_nr_inst() { return nr_instante; } private: static int nr_instante; }; int A::nr_instante = 0; void main() { A a; A b; cout << a.get_nr_inst() << endl; cout << b.get_nr_inst() << endl; }
Dorel Lucanu
69
// OK. // eroare
$ de ce eroare? # un pointer la o functie membra trebuie sa se potriveasca in trei elemente: numarul si tipurile argumentelor tipul valorii returnate tipul clasei a carei membra este ! pointer la membrul unei clase int (Data::*fint)(); fint = Data::get_zi;
// OK!
Dorel Lucanu
70
Dorel Lucanu
73
Clase (continuare X)
! obiectele ca membre ale unei clase class Student { public: Student(char*); Student(char*, int); ~Student() {} private: String nume; int virsta; }; " initializarea obiectelor membre Student::Student(char *un_nume, int o_virsta) : nume(un_nume), virsta(o_virsta) { //nimic } " ordinea apelarii constructorilor Student(Ionescu,22); //virsta = 22 //String::String(char*) //Student::Student(char*, int)
Dorel Lucanu Programarea calculatoarelor (C++) 75
Dorel Lucanu
77
Curs 8
! Clase (continuare) " initializarea membru cu membru, constructorul de copiere X::X(const X&) " operatorul de atribuire X& X::operator=(const X&) ! Clase parametrizate " stive parametrizate " cozi parametrizate " liste parametrizate " prieteni si clase parametrizate
Dorel Lucanu
78
Dorel Lucanu
79
Dorel Lucanu
80
Dorel Lucanu
82
Clase parametrizate I
! stive parametrizate " reprezentarea simplu inlantuita template <class Elt> class NodStiva { public: friend class Stiva<Elt>; private: Elt elt; NodStiva *leg; } template <class Elt> class Stiva { public: Stiva(); ~Stiva(); void push(Elt); void pop(); Elt top(); private: NodStiva<Elt> *virf; };
Dorel Lucanu Programarea calculatoarelor (C++) 84
Clase parametrizate II
template <class Elt> void Stiva<Elt>::push(Elt un_e) { NodStiva<Elt> *p = new NodStiva<Elt>; assert (p != 0); p->elt = un_e; p->leg = virf; virf = p; } template <class Elt> Elt Stiva<Elt>::top() { return virf->elt; } //...
Dorel Lucanu
85
Dorel Lucanu
86
Clase parametrizate IV
template <class Elt, int MAX_STIVA> Stiva<Elt, MAX_STIVA>::Stiva() { ptab = new Elt[MAX_STIVA]; virf = -1; } ! prieteni si clase parametrizate " prieteni neparametrizati template <class Elt> class Nod { Elt elt; //... friend void a(); }
Dorel Lucanu
87
Clase parametrizate V
" prieteni parametrizati legati template <class Elt> class NodStiva { //... friend class Stiva<Elt>; } " prieteni parametrizati nelegati template <class Elt> class Nod { Elt elt; //... template <class T> friend void a<T>(); }
Dorel Lucanu
88
Curs 9
! Relatia de mostenire (derivare) " Exemple: most.h, most_demo.cpp " definirea mostenirii " accesul la membrii mosteniti " initializarea bazei de clasa " tipuri de mosteniri " conversii standard " ordinea de initializare sub mostenire " copiere si atribuire sub mostenire
Dorel Lucanu
89
Ierarhia RxR
Complex PctPlan transl() mutaLa() conj() operator+() operator*() operator-() RxRx R z : float setZ() getY()
Dorel Lucanu
90
class RxR { protected: . . . public: . . . }; class PctPlan : public RxR { public: . . . }; class Complex : public RxR { public: . . . }; class RxRxR : public RxR { protected: float z; public: . . . }; class PlanComplex : public PctPlan, public Complex {. . .}; class PctSpatiu : public RxRxR { public: . . . };
Dorel Lucanu Programarea calculatoarelor (C++) 91
Mostenire (continuare I)
! accesul la membrii mosteniti PctSpatiu p(10.0,10.0,10.0); p.setX(20.0); a = p.getZ(); b = p.modul(); // RxRxR::modul() c = p.RxR::modul(); ! initializarea clasei de baza RxRxR(float un_x, float un_y, float un_z ) : RxR(un_x, \ \ \ un_y), z(un_z) {}
# o clasa de baza care nu declara constructor sau declara un constructor fara argumente nu necesita initializarea explicita # constructorii de baza sint invocati inaintea celor derivati ! nivele de protectie a membrilor: " public: cunoscut de toata lumea " protected: cunoscut de clasa proprietara si de clasele mostenitoare " private: cunoscut numai de clasa proprietara
Dorel Lucanu
92
Dorel Lucanu
94
Dorel Lucanu
95
Mostenire (continuare V)
! ordinea de copiere sub mostenire PctSpatiu Q = P; // se apeleaza constructorii in ordine // RxR(const RxR&); RxRxR(const RxRxR&) // PctSpatiu(const PctSpatiu&) RxR A; A = P; // se apeleaza operatorul de atribuire // RxR::operator =(const RxR&) # Atentie la pointeri; in cazul acesta exista constructori X(const X&) si X& X::operator=(const X&) definiti expliciti. # Se disting situatiile: Clasa Clasa de baza derivata implicit implicit explicit implicit explicit explicit explicit Ordinea de apelare !constr. definit de clasa de baza !constr. definit de clasa derivata !constr. definit de clasa derivata !revine constr. clasei derivate responsabilitatea de a apela constr clasei de baza
Programarea calculatoarelor (C++) 96
Dorel Lucanu
Curs 10
! Clase de baza virtuale (mostv.h, mostv_demo.cpp) ! Derivare si parametrizare (lista.h) ! Functii virtuale " problema " o posibila solutie (nerecomandata) (most1.h, most1dem.cpp) " declararea functiilor virtuale (most2.h, most2dem.cpp) " functii virtuale pure " o alta posibila ierarhie de liste? LLinOrd : public Llin ! Glosar termeni POO
Dorel Lucanu
97
Rx R
Rx R
Pc tP lan
C om plex
P lanC om plex
Rx R
P c t P lan
C om plex
P lanC om plex
Dorel Lucanu
98
Derivare si parametrizare
Dorel Lucanu
100
Dorel Lucanu
101
Dorel Lucanu
103
Functii virtuale
! problema float f(RxR& a) { return a.modul(); } PctSpatiu P(10,10,10); RxR A = P; cout << f(P) << ", " << f(A) << endl; //afiseaza acelasi lucru 14.14... ! o posibila solutie enum tip { rXr, rXrXr }; class RxR { //... tip isA() const {return rXr;} } class RxRxR { //... tip isA() const {return rXrXr;} }
Dorel Lucanu
104
Dorel Lucanu
106
Glosar POO
Dorel Lucanu
107
Curs 11
! Biblioteca standard C++ " ce include " Exemple: siruri (stdlib1.cpp) vectori (stdlib2.cpp) liste (stdlib3.cpp) tablouri asociative (stdlib4.cpp) iteratori algoritmi STL framework
Dorel Lucanu
108
Biblioteca standard
! ce contine: " siruri <string> <cstring> <cstdlib> etc " containeri <vector> <list> <queue> <stack> <map> etc " iteratori <iterator> " algoritmi <algorithm> <cstdlib> " intrari/iesiri <iostream> <istream> etc " etc
Dorel Lucanu Programarea calculatoarelor (C++) 109
Dorel Lucanu
110
Dorel Lucanu
111
. . . agTel["Ionescu"] = 123456; agTel["Popescu"] = 654321; . . . typedef \ map<string, long>::const_iterator LI; for (LI p = agTel.begin(); \ p != agTel.end(); ++p) cout << p->first << ' ' << p->second; . . . cout << agTel["Popescu"] << endl; cout << agTel["Ionescu"] << endl;
Dorel Lucanu
114
Dorel Lucanu
115
agTel["Ionescu"] = 123456; . . . agTel.insert(agTel.end(), \ make_pair(string("Zorzonel"), \ 123543)); typedef map<string, long>::iterator MI; MI q = agTel.find("Popescu"); if ( q == agTel.end()) cout << "Nu este in carte." << endl; else agTel.erase(q);
Dorel Lucanu
117
Dorel Lucanu
118
STL (continuare X)
! tablouri asociative cu chei multiple si valoare structurata class Info { public: Info(); Info(string o_adr, long un_nr); string getAdr() const; void setAdr(string o_adr); long getNr() const; void setNr(long un_nr); private: string adr; long nr; }; multimap<string, Info> agTel; //... agTel.insert(agTel.end(), make_pair("Ionescu", Info("Merilor 6", 123456))); //... cout << p->second.getAdr();
Dorel Lucanu
119
Curs 12
! POO :: Studiu de caz:: Concurs de gimnastica (clasam.cpp) " problema " identificarea claselor " identificarea atributelor si operatiilor " modelarea relatiilor dintre clase " comunicarea intre obiecte " descriere in C++
Dorel Lucanu
120
Dorel Lucanu
122
Gimnast
nota[] nrOrd media() setNote() setNota() setNrOrd() getNrOrd()
Arbitru
masa getMasa() setMasa() daNota()
Dorel Lucanu
123
Juriu
arbitru[6] daNote() <<operator>> []() stabilesteComp()
6 Arbitru
Dorel Lucanu
124
Clasament
1
Dorel Lucanu Programarea calculatoarelor (C++)
*
planifica() clasifica() afiseaza() stabilesteComp() nr *gim[nr]
Gimnast
125
Concurs
Clasament
* Gimnast
Dorel Lucanu
Arbitru
Juriu
126
1: daNote()
: Gimnast
: Juriu
2: daNota( )
: Arbitru
Dorel Lucanu
127
Dorel Lucanu
planifica
evolueaza si noteaza
128
Dorel Lucanu
130
Curs 13
! POO: Automatul de racoritoare (vm.cpp, vm.h, vm_demo.cpp) " definirea problemei " identificarea claselor iniiale " identificarea atributelor i funciilor " interaciunea dintre obiecte " interfa utilizator " reutilizare " interaciunea dintre Domeniul Problemei (DP) i Interfaa Utilizator (IU)
Dorel Lucanu
132
Definirea problemei
Automatele de cafea, rcoritoare sau dulciuri au nceput s-i fac simit prezena n multe locuri din Romnia. Funcionalitatea acestor automate poate fi neleas mai bine dac am avea posibilitatea s ne jucm cu diverse tipuri de automate. Pentru acest scop se dorete construcia unui sistem software care s simuleze astfel de automate.
Dorel Lucanu
133
Descrie mai nti un scenariu: Sunt o persoan (nsetat/nfometat). Merg ctre automat. Privesc ce produse sunt disponibile. Pentru fiecare produs voi vedea numele i preul. Doresc s vd ce sum am introdus n automat pn la un moment dat. Dupa ce-am introdus ceva cash, m rzgndesc, mi iau banii napoi i revin mai trziu. Sau selectez produsul pe care l doresc. mi iau produsul. mi iau restul (dac este cazul) . Plec.
Dorel Lucanu
134
Dorel Lucanu
135
Fiecare obiect i prezint proprietile (atributele) pe care le are i serviciile pe care le ofer: Sunt un articol i mi cunosc numele; mi cunosc preul; am abilitatea de a m vinde. Sunt un suport de articole i cunosc articolele pe care le gzduiesc. Sunt un dispozitiv de bani i mi cunosc suma colectat; pot primi bani cash; pot decide dac am colectat suficient pentru un anumit articol; tiu s dau restul; tiu s returnez banii.
Dorel Lucanu
136
SuportArt articole[NR_MAX_ART] vindeArtDispensabil() dispenseaza() 1 DispBani sumaColectata adaugaCash() colectaSufic() daRest() returneazaCash()
Dorel Lucanu
137
Un scenariu posibil: Sunt un suport de articole. Cineva mi spune s eliberez articolul de vndut. Verific dac articolul de vndut este dispensabil. Dac da, i spun s se vnd. Sunt un articol. Cineva mi spune s m vnd. ntreb dispozitivul de bani dac a colectat suficieni bani pentru a m vinde. Dac da, atunci i spun suportului meu s m elibereze i transmit dispozitivului de bani s dea restul.
Dorel Lucanu
138
adaugaCash( )
vindeArtDispensabil( )
vinde( )
colectaSufic( )
dispenseaza( )
daRest( )
Dorel Lucanu
139
class Art { public: ... // Conexiunea cu suportul de articole Suport_Art& get_suport_art() { return *un_suport_art; } void conecteaza_la_suport(Suport_Art& suport_nou) { un_suport_art = &suport_nou; } // Conexiunea cu dispozitivul de bani Disp_Bani& get_disp_bani() { return *un_disp_bani; } void conecteaza_la_disp_bani(Disp_Bani& un_disp_nou) { un_disp_bani = &un_disp_nou; } ... }
Dorel Lucanu
140
Interfaa utilizator
C ontainerAfisareAutom at
C ontainerAfisareArt
M eniuD ispBani
D isplayBoxDispBani M eniuArt
D ispalyBoxArt
Dorel Lucanu
141
Reutilizare
Meniu
MeniuDispBani
MeniuArt
DisplayBox
DisplayBoxDispBani
DispalyBoxArt
Dorel Lucanu
142
:M eniuD ispBani
:D ispBani
: DisplayBoxD ispBani
: SuportArt
adaugaC ) ash(
afiseazaValoare( )
v indeArtDispensabil( )
Dorel Lucanu
143
Dorel Lucanu
144
class Display_Box_Disp_Bani : public Display_Box{ public: // Constructors/destructors Display_Box_Disp_Bani() { } ~Display_Box_Disp_Bani() { } // Implementors void afiseaza_valoare(); // Accesorii Disp_Bani& get_disp_bani() { return *un_disp_bani; } void set_disp_bani(Disp_Bani& disp_nou) { un_disp_bani = &disp_nou; } private: // Date membre Disp_Bani* un_disp_bani; };
Dorel Lucanu
145
Concluzii
! Utilizarea unei notaii grafice n fazele de analiz i proiectare. ! Utilizarea unui instrument CASE pentru trasarea diagramelor. ! Crearea de scenarii care s evidenieze att proprietile obiectelor ct i relaiile dintre acestea. ! Scrierea codului numai dup ce analiza i proiectarea au produs specificaii clare i detaliate.
Dorel Lucanu
146
Curs 14
! Programare C++: Reguli i Recomandri " organizarea codului surs n fiiere " atribuirea de nume " comentarii " clase " funcii " constante " variabile " pointeri i referine " conversii de tip " structuri de control " expresii " alocarea memoriei " tratarea excepiilor " portabilitate ! Cele 10 porunci ctr programatorul C
Dorel Lucanu
147
Motivaie
! Obiectivele pecare trebuie s le ating un program sunt: " programul s fie corect, i " uor de ntreinut. ! Un program poate atinge aceste obiective dac: " are un stil consistent, " este uor de citit i de nteles, " este portabil pe alte arhitecturi, " nu are erori, i " poate fi ntreinut de diferii programatori.
Dorel Lucanu
148
Dorel Lucanu
149
Dorel Lucanu
150
Dorel Lucanu
151
Dorel Lucanu
154
Dorel Lucanu
156
Dorel Lucanu
157