codice:#ifndef PERSONA_H #define PERSONA_H #include <iostream> // using namespace std; <-- *mai* istruzioni using negli header class Persona { istream& operator >> (istream& in, Persona& P); ostream& operator << (ostream& out, const Persona& P); public: Persona(); Persona(const Persona & ); Persona(const std::string & Nome, const std::string & Cognome, int Eta); // non ha senso dichiarare un parametro non-puntatore e non-reference come const // I getter si possono tranquillamente lasciare inline const std::string & GetNome() const { return nome; }; const std::string & GetCognome() const { return cognome; }; const int GetEta() const {return eta; }; ~Persona(); private: std::string nome; std::string cognome; int eta; }; #endifNota che nell'operatore di input c'è ancora un problema, a te individuarlo.codice:#include <iostream> #include <stdexcept> #include "Persona.h" using namespace std; // in effetti è inutile, basterebbe quello di default // qui uso la sintassi dell'initializer list per costruire i campi direttamente // con i valori desiderati, invece di farli costruire con il costruttore di default // e poi fare assegnamenti nel corpo della funzione Persona::Persona(const Persona & Right) : nome(Right.GetNome()), cognome(Right.GetCognome()), eta(Right.GetEta()) { } Persona::Persona() : eta(0) { } Persona(const std::string & Nome, const std::string & Cognome, int Eta) : nome(Nome), cognome(Cognome), eta(Eta) { if(Eta<0) throw std::invalid_argument("Eta deve essere positivo."); } Persona::~Persona() { // inutile } ostream& operator << (ostream& out, const Persona& P) { out << P.Nome << " " << P.Cognome << " " << P.Eta << " anni" << endl; return out; } istream& operator >> (istream& in, Persona& P) { cout << "Inserire Nome: "; getline(in, P.nome); cout << "Inserire Cognome: "; getline(in, P.cognome); cout << "Inserire età: "; in >> P.Eta; return in; }![]()