Le classi composte sono comprese tra le possibilità messe a disposizione dal linguaggio di programmazione C++ che è noto per il suo supporto all’orientamento agli oggetti. Tra i concetti fondamentali dell’orientamento agli oggetti in C++, le classi composte giocano un ruolo cruciale nell’incapsulare dati e funzionalità in strutture più complesse.
Cos’è una Classe Composta?
Una classe composta in C++ è una classe che contiene uno o più oggetti di altre classi come membri. Questo concetto è noto anche come “composizione” e consente agli sviluppatori di costruire strutture più complesse combinando più classi in una singola entità.
Vantaggi della Composizione
- Incapsulamento Avanzato: Le classi composte supportano un livello più avanzato di incapsulamento. Ogni oggetto contenuto all’interno di una classe composta può essere accessibile solo tramite l’interfaccia pubblica della classe contenitore, contribuendo a mantenere l’integrità dei dati e a limitare l’accesso non autorizzato.
- Riutilizzo del Codice: La composizione promuove il riutilizzo del codice. Una classe composta può riutilizzare funzionalità esistenti fornite da altre classi senza la necessità di ereditarietà, semplificando la gestione delle dipendenze.
- Struttura Gerarchica: La composizione consente di costruire strutture gerarchiche complesse. Ad esempio, un oggetto di una classe composta può contenere oggetti di altre classi composte, creando una gerarchia di oggetti anche complessa ma ben organizzata.
Particolarità
La cosa più particolare è che il costruttore di una classe composta deve, prima di fare altro, richiamare implicitamente o esplicitamente il costruttore dell’attributo che è oggetto di un’altra classe, si rimanda alla pagina specifica sui costruttori delle classi composte.
Ulteriore particolarità da sottolineare è che in una classe posso usare direttamente i propri membri (metodi e attributi) sia pubblici che privati, ma se un attributo è un oggetto dalla classe che lo incorpora di quell’oggetto si potranno usare direttamente solo i membri (metodi o attributi) pubblici.
Esempio
Ecco un esempio di una classe composta in C++, la classe rappresenta una coppia di persone di cui vegono memorizzata altezza ed età e il loro numero di figli.
#include <iostream>
using namespace std;
class Persona
{
int eta;
double altezza;
public:
// Costruttore
Persona(int e, double a) : eta(e), altezza(a) {}
// Metodo set per l'età
void setEta(int e)
{
eta = e;
}
// Metodo set per l'altezza
void setAltezza(double a)
{
altezza = a;
}
// Metodo get per l'età
int getEta()
{
return eta;
}
// Metodo get per l'altezza
double getAltezza()
{
return altezza;
}
};
class Coppia
{
Persona p1;
Persona p2;
int numeroFigli;
public:
Coppia(int e1, double a1, int e2, double a2, int nf):p1(e1,a1),p2(e2,a2)
{
numeroFigli=nf;
}
// Metodo get per il numero di figli
int getNumeroFigli()
{
return numeroFigli;
}
// Metodo aumentare di uno il numero di figli
void nuovoFiglio()
{
numeroFigli++;
}
// Metodo per restituire l'altezza media della coppia
double altezzaMedia()
{
return (p1.getAltezza()+p2.getAltezza())/2;
}
// Metodo per restituire l'altezza della prima persona della coppia
double getP1Altezza()
{
return p1.getAltezza();
}
// Metodo per restituire l'altezza della seconda persona della coppia
double getP2Altezza()
{
return p2.getAltezza();
}
// Metodo per restituire l'età della prima persona della coppia
double getEtaPersona1()
{
return p1.getEta();
}
// Metodo per restituire l'età della seconda persona della coppia
double getEtaPersona2()
{
return p2.getAltezza();
}
//Metodo compleanno persona 1
void compleannoP1()
{
p1.setEta(p1.getEta()+1);
}
//Metodo compleanno persona 2
void compleannoP2()
{
p2.setEta(p2.getEta()+1);
}
};
int main() {
// Creazione di un oggetto Coppia
Coppia coppia1(25, 1.75, 28, 1.90, 1);
// Utilizzo del metodi get per ottenere i valori
cout<<"numero figli "<<coppia1.getNumeroFigli()<<endl;
cout<<"eta' persona 1: " << coppia1.getEtaPersona1() << " anni" << endl;
// Uso i metodi per aumentare l'eta' della prima persona della coppia
coppia1.compleannoP1();
// Stampa dei nuovi valori
cout << "Nuova età: " << coppia1.getEtaPersona1() << " anni" << endl;
return 0;
}
In questo esempio, la classe Coppia
ha tre attributi privati p1
e p2
che sono le due persone che formano la coppia e il loro numero di figli. La classe coppia fornisce metodi pubblici per lavorare con i metodi delle due persone e i loro attributi. Il costruttore inizializza gli attributi al momento della creazione dell’oggetto, richiamando i costruttori di persona. I metodi getEta consentono di recuperare i valori degli attributi che rappresentano le età delle persone.
Esercizi
Per esercizi sulle classi composte si rimanda all’apposita sezione della pagina con gli esercizi sulla programmazione ad oggetti.
Conclusioni
Le classi composte in C++ offrono una potente via per organizzare e strutturare il codice in modo modulare. Consentono la creazione di strutture complesse attraverso la combinazione di più classi, promuovendo l’incapsulamento e il riutilizzo del codice. Comprendere come utilizzare la composizione è fondamentale per sviluppare software robusto, manutenibile ed efficiente in C++.