Corso di programmazione, Simulazione, ROOT, code, ecc. ecc. Per il Servizio Elettronica e Rivelatori INFN Sezione di Napoli Luca Lista, UniNa & INFN
Programmazione ad oggetti in C++
Classi in c++ Le classi sono una significativa evoluzione delle struct C, ed aggiungono funzioni oltre alle variabili Oltre ad aumentare le funzionalità, rappresentano un cambio di paradigma La programmazione si può focalizzare sul comportamento di classi di oggetti e delle loro relazioni anziché sull'algoritmo e sulla struttura dei dati Oltre alla semplice estensione delle struct C, le classi offrono molte ulteriori possibilità
Classe Histogram: dichiarazione Histogram.h #ifndef HISTOGRAM_H #define HISTOGRAM_H class Histogram { public: Histogram(int bins, double xmin, double xmax); //costruttore ~Histogram(); //distruttore void fill(double x); //metodo void print() const; //metodo (accesso costante) private: int _bins; double _xmin, _xmax; double * _entries; }; #endif Interfaccia pubblica attributi privati
Class Histogram: uso Histogram_main.cpp #include <cstdlib> #include "Histogram.h" int main() { Histogram h(10, 0, 1); for(int i = 0; i < 100; i++) { h.fill(drand48()); } h.print(); }
Class Histogram: Implementazione Histogram.cc #include "Histogram.h" #include <iostream> #include <iomanip> #include <cmath> Histogram::Histogram(int bins, double xmin, double xmax) : _bins(bins), _xmin(xmin), _xmax(xmax) { _entries = new double[bins]; for(int i = 0; i < bins; ++i) _entries[i] = 0; } Histogram::~Histogram() { delete [] _entries; } void Histogram::fill(double x) { int bin = (x - _xmin)/(_xmax - _xmin) * _bins; if(bin < 0 || bin >= _bins) return; _entries[bin]++; } void Histogram::print() const { double dx = (_xmax - _xmin)/_bins; for(int i = 0; i < _bins; i++) { double x1 = i * dx; double x2 = x1 + dx; std::cout << "[" << std::fixed << std::setw(5) << std::setprecision(4) << x1 << ", " << std::setw(5) << std::setprecision(4) << x2 << "] "; for(int j = 0; j < _entries[i]; j++) std::cout << "="; std::cout << " (" << std::setw(5) << std::setprecision(4) << _entries[i] << ")\n"; } }
Ereditarietà come estensione Persona.h Utente.h class Persona { public: void print() const; private: string _nome, _cognome; date: _nascita; }; #include "Persona.h" class Utente : public Persona { public: void login(const string & passwd) const; private: string _userName; string _encriptedPasswd; }; Una sottoclasse eredita tutti i metodi e gli attributi dalla classe principale public specifica che tutti i metodi pubblici della classe di base restano pubblici anche nella sottoclasse
funzioni virtuali Shape.h Rectangle.h class Shape { // . . . virtual void Draw() = 0; // . . . }; class Rectangle : public Shape { Rectangle(double x1, double y1, double x2, double y2); virtual void Draw(); }; Le funzioni definite virtual corrispondono ad una tabella di puntatori in memoria per ogni oggetto (virtual table) La possibilità di chiamare la funzione giusta a run time ha una (piccola) penalità di velocità dovuta all'indirezione tramite puntatore
Ereditarietà e polimorfismo
Ereditarietà e polimorfismo Soldato
Templates template<typename T> struct Node { T val; struct node * next; }; template<typename T> class List { void push(const T& t); T & front(); T & back(); pop_front(); pop_back(); private: struct Node<T> * _front; };
Standard Template Library La STL è una libreria di contenitori di oggetti Il tipo di oggetti che può essere contenuto è generico, grazie all'implementazione che usa i templates L'interfaccia dei vari contenitori è standardizzata Lo scorrimento attraverso i contenitori è implementato attraverso classi ausiliarie dette iteratori Contiene diverse utility di manipolazione (es.: ordinamento)
StD::vector #include <vector> #include <iostream> int main() { std::vector<int> v; for(int i = 0; i < 10; i++) v.push_back(i); std::cout << v.size() << std::endl; for(int i = 0; i < v.size(); ++i) std::cout << v[i] << std::endl; for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); i++) std::cout << *i << std::endl; }
Std::sort #include <algorithm> // . . . bool reverse_sort(double x, double y) { return x > y; } int main() { // . . . std::sort(v.begin(), v.end()); for(std::vector<double>::const_iterator i = v.begin(); i != v.end(); i++) std::cout << *i << std::endl; std::cout << "------" << std::endl; std::sort(v.begin(), v.end(), reverse_sort); for(std::vector<double>::const_iterator i = v.begin(); i != v.end(); i++) std::cout << *i << std::endl; }
Stringhe in C++ #include <string> int main() { std::string str1; str1 = "Ciao"; int s = s1.length(); std::cout << str1 << std::endl; std::string str2 = str1 + " ciao"; int f = 0; if(str2 != "Ciao") f = str2.find(str1); const char * c = str1.c_str(); }
Auto std::vector<int> v {12, 13, 14}; std::vector<int>::iterator iter_std = v.begin(); auto iter = v.begin(); Semplifica l'uso di tipi molto lunghi da scrivere Il tipo è determinato dal lato a destra del segno = nell'assegnazione
STL Riferimenti Tutorial: https://www.topcoder.com/community/competitive- programming/tutorials/power-up-c-with-the-standard-template- library-part-1/ https://www.topcoder.com/community/competitive- programming/tutorials/power-up-c-with-the-standard-template- library-part-2/ Overview: https://www.geeksforgeeks.org/the-c-standard-template- library-stl/ Contenitori: http://www.cplusplus.com/reference/stl/