Programmazione Avanzata in C++ – Scrivere una classe

La programmazione in C++ con il paradigma dell’approccio orientato agli oggetti prevede da parte dello sviluppatore lo sviluppo di classi. Una classe è una struttura dati astratta composta da dati e funzionalità per la lettura e la scrittura dei dati stessi. Una classe è un modello che è utilizzato in programma per definire / istanziare oggetti che rappresentano un elemento specifico di quella classe.
Ad esempio una classe “Persona” è l’insieem di soggetti che hanno in comune dei dati quali il cognome, il nome, la data di nascita, il luogo di nascita e così via.
Un oggetto è una persona specifica ad esempio “Mario Rossi nato a Roma il 13-10-1980”.
In questo modo la classe rappresenta l’insieme di tutti i possibili elementi di quell’insieme caratterizzato da elementi in comune.
I vantaggi nella programmazione Orientata ad Oggetti OOP (“Object Oriented Programming” sono evidenti in quanto le classi sono riciclabili in termini di codice e estensibili, aggregabili. Quindi si risparmia tempo nella scrittura di codice e il programmatore è concentrato sull’aspetto concettuale di risoluzione del problema..
La progettazione delle classi parte dallo sviluppo del diagramma UML con il diagramma di classe che contiene il nome della classe, gli attributi della classe ovvero i dati che vogliamo immagazzinare nella classe e i metodi ovvero le funzioni che permettono di leggere e scrivere i dati della classe.
Ogni attributo / metodo è definito membro della classe e possiede un modificatore di accesso ovvero un’indicazione di visibilità dall’esterno della classe.
Il modificatore private indica che i membri sono accessibili solo dall’interno della classe. Il modificatore pubblico permette l’accesso ai membri della classe da qualunque classe. Esiste un modificatore intermedio protected che permette l’accesso a classi derivate.
In ogni classe è possibile definire un metodo costruttore che inizializza ad esempio i dati della classe. In una classe possono essere presenti anche più costruttori l’importante che la firma sia diversa (l’elenco dei parametri).
Nella scrittura di un programma in C++ ad esempio con il software IDE Dev C++ occorre creare un progetto e aggiungere oltre al file main.cpp che è il programma di test due file per ogni classe un file con estensione “h” header della classe e un file con estensione “cpp” che contiene l’implementazione della classe.
Il diagramma UML per la classe “Persona” in questo articolo, prevede tre attributi nome, cognome ed età di una persona due costruttori, e sette metodi.
I primi tre metodi sono di tipo void per impostare i valori degli attributi dall’esterno della classe ad esempio nel main, tre metodi che hanno come tipo di ritorno string, string, int che ritornano rispettivamente il nome, il cognome e l’età di una persona, e un metodo che ritortna string che prepara la stampa di output dei dati di quella particolare persona. Nel main è istanziato un oggetto e sono stampate le caratteristiche di quell’oggetto.
Lo schema UML è:

UML diagramma della classe Persona

Il codice di Persona.h

#include <string>
using namespace std;
class Persona
{
	private:
		string nome;
		string cognome;
		int age;
	public:
		Persona(string _n, string _c, int _a);
		void setNome(string x);
		void setCognome(string x);
		void setAge(int a);
		string getNome();
		string getCognome();
		int getAge();
		string toString();
		
};

Il codice di Persona.cpp

#include "Persona.h"
#include <sstream>
using namespace std;
Persona::Persona(string _n, string _c, int _a)
{
	cognome=_c;
	nome=_n;
	age=_a;
}
void Persona::setNome(string x)
{
	nome=x;
}
void Persona::setCognome(string x)
{
	cognome=x;
}
void Persona::setAge(int a){
	age=a;
}
string Persona::getNome()
{
	return nome;
}
string Persona::getCognome()
{
	return cognome;
}
int Persona::getAge()
{
	return age;
}
string Persona::toString()
{
	string tmp;
	ostringstream s;
	s<< age;
	string x=s.str();
	tmp="\nCognome:"+cognome;
	tmp=tmp+"\nNome:"+nome;
	
	tmp=tmp+"\nEta':"+x;
	tmp=tmp+"\n";
	return tmp;
}

Il codice del main.cpp

#include <iostream>
#include "Persona.h"
using namespace std;
int main() {
	string c,n;
	int a;
	cout << "\n Inserisci cognome Persona:";
	getline(cin,c);
	cout << "\n Inserisci il nome Persona:";
	getline(cin,n);
	cout << "\n Inserisci l'eta' della Peronsa:";
	cin >> a;
	// istanziamento di un oggetto della classe
	Persona p(n,c,a);
	// richiamo del metodo toString della classe Persona
	string msg=p.toString();
	cout << msg << endl;
	return 0;
}

Nel file Peronsa.cpp è utilizzata la classe <sstream> per convertire un numero in una stringa.
Per fare questo occorre prima definire uno stringstream che riceva in output il valore della variabile numero e poi che mediante il metodo str() della classe sstream lo traduca in stringa. Solo dopo potrà essere inserita in una stringa di output.
Nel main.cpp l’inclusione è sempre del file con estensione “h”. Importante che i nomi delle classi siano con la prima lettera maiuscola e che il file con estensione “cpp” e “h” abbiamo lo stesso nome.

Video della lezione pratica