Sto lavorando a questa classe Persona. Il problema è che vorrei ottimizzare l'allocazione delle stringhe Nome e Cognome. Nel costruttore senza argomenti ho riscontrato che devo necessariamente stabilire un valore massimo di elementi, nella fattispecie MAX, altrimenti se inserisco un nome od un cognome di una lunghezza superiore ai 16 caratteri (credo sia uno standard) il programma va in pappa, e le stringhe si sovrappongono. Però mi interesserebbe un'allocazione più intelligente, come per i costruttori che ho scritto, sia quello di copia che quello con gli argomenti. Un altro problema è che se alloco un oggetto con il costruttore con argomenti, ed applico su di esso la cin >>, se le stringhe che inserisco da tastiera sono più lunghe di quelle inserite come argomenti, ritorno allo stesso problema precedente.
Spero di essere stato chiaro, se servono altri chiarimenti chiedete.
Grazie anticipatamente per l'aiuto.
PS Ho anche avanzato l'ipotesi di aver sbagliato completamente l'impostazione della progettazione e che va riveduta dal principio, quindi nel caso, non abbiate paura di dirmelo. A patto che però mi consigliate una soluzione. :)
codice:
#ifndef PERSONA_H
#define PERSONA_H
#include <iostream>
using namespace std;
class Persona
{
friend istream& operator >> (istream& in, Persona& P);
friend ostream& operator << (ostream& out, const Persona& P);
public:
Persona();
Persona(const Persona &);
Persona(const char *, const char *, const int);
const char * getN() const;
const char * getC() const;
const int getE() const;
~Persona();
private:
char * Nome;
char * Cognome;
int Eta;
};
#endif
codice:
#include <iostream>
#include "Persona.h"
using namespace std;
#define MAX 100
Persona::Persona() //Da migliorare, per ottimizzare l'occupazione di memoria
{
char s [] = "";
Nome = new char[MAX];
Cognome = new char[MAX];
strcpy(Nome,s);
strcpy(Cognome,s);
Eta=0;
}
Persona::Persona(const Persona & P)
{
Nome = new char [strlen(P.getN()+1)];
Cognome = new char [strlen(P.getC())+1];
strcpy(Nome,P.getN());
strcpy(Cognome,P.getC());
Eta=P.getE();
}
Persona::Persona(const char * N, const char * C, const int E)
{
Nome = new char [strlen(N)+1];
Cognome = new char [strlen(C)+1];
strcpy(Nome,N);
strcpy(Cognome,C);
Eta=E;
}
Persona::~Persona()
{
delete [] Nome;
delete [] Cognome;
}
const char * Persona::getN() const
{
return Nome;
}
const char * Persona::getC() const
{
return Cognome;
}
const int Persona::getE() const
{
return Eta;
}
ostream& operator << (ostream& out, const Persona& P)
{
out << P.Nome << " " << P.Cognome << " " << P.Eta << " anni" << endl;
return out;
}
istream& operator >> (istream& in, Persona& P)
{
char s1[MAX];
char s2[MAX];
cout << "Inserire Nome: "; in.getline(s1,MAX);
cout << "Inserire Cognome: "; in.getline(s2,MAX);
cout << "Inserire età: "; in >> P.Eta;
strcpy(P.Nome,s1);
strcpy(P.Cognome,s2);
return in;
}