Esercizio Classi

di il
7 risposte

Esercizio Classi

Salve a tutti,
circa un esercizio preso dal web: " Creare una classe Persona per memorizzare cognome, nome ed età di una persona. La classe deve
disporre di un opportuno costruttore, di metodi che consentano l’accesso in lettura a tutti gli attributi, di un
metodo per l’eventuale modifica dell’età e del metodo stampa_anagrafica per la stampa a video di tutte le
informazioni sulla persona. Successivamente, scrivere un programma che legga da tastiera i dati di due
persone, li memorizzi in oggetti distinti e indichi se le due persone sono coetanee."

Il codice scritto da me è il seguente:

#include <iostream>
#include <string>

using namespace std;


class Persona
{

    public:
        int eta;

        // COSTRUTTORE

        void Anagrafica()
        {
            cout << "Inserisci nome: ";
            cin >> nome;

            cout << "Inserisci cognome: ";
            cin >> cognome;

            cout << "Inserisci eta': ";
            cin >> eta;

            cout << " " << endl;


        }

        /*void Modifica_eta()
        {

           cout << "Modificare eta': ";
           cin >>  eta_mod;

           eta = eta_mod;


        }*/

        void Stampa_anagrafica()
        {
            cout << " " << endl;
            cout << "Anagrafica Cliente" << endl;
            cout << nome << " " << cognome << " " << eta << endl;
        }


    private:
        string nome, cognome;
        int eta_mod;

};



int main()
{
    Persona p1, p2;

    p1.Anagrafica();
    p2.Anagrafica();
    system("cls");

    p1.Stampa_anagrafica();
    p2.Stampa_anagrafica();

    if(p1.eta == p2.eta)
    {
        cout << "Eta' uguali";
    }




    return 0;
}
Ora, vorrei sapere se a livello di "information hiding" ho sbagliato qualcosa. Il dubbio è sulla variabile "eta" che, per eseguire la comparazione delle età, ho dovuto metterla pubblica. Un altro dubbio è circa la funzione Modifica_eta() che ho messo come commento in quanto non saprei quando usarla (magari con una condizione che si ripete ad ogni fine ciclo?). Anche in questo caso il dubbio verte sulla visibilità delle variabili.
Vorrei capire come scrivere il codice nella maniera corretta se per esempio un'altra persona dovesse utilizzarlo (quindi una correzione professionale senza usare programmazione avanzata).

Grazie!

7 Risposte

  • Re: Esercizio Classi

    Il tuo esempio fa acqua da tutte le parti.
    1) il costruttore non si puo' chiamare Anagrafica, se la classe si chiama Persona.

    NON INVENTARTI la terminologia
    NON USARE i termini a sproposito

    altrimenti non capiamo noi cosa chiedi e non capisci tu le risposte.

    Lasci stare le battute sulla programmazione professionale: qui' siamo alle basi delle basi delle basi.

    1) in genere lo STATO di un oggetto (i campi, come 'eta') sono sempre privati o al limite protetti, praticamente mai pubblici.
    2) allo stato dell'oggetto ci accedi SOLO mediante setter/getter (ad esempio setEta(nuovaEta) getEta() che ritorna l'eta)
    3) se l'eta' di una persona cambia, di sicuro non cambia il nome, quindi per il nome non ci deve essere il setter, ma solo ik getter.
    Allora, come inizializzare il nome? Nel COSTRUTTORE, quello VERO, non come hai fatto tu.
    4) SEPARA il modo in cui ricuperi i valori dei campi dal modo in cui li imposti. SUPPONI di dover creare oggetti di tipo Persona da file. E' ovvio che non ti serve a niente un metodo che legge da console, e non ha senso aggiungere metodi simili per OGNI possibile modo il cui potresti inizializzare l'oggetto (sono infiniti) .
    5) fatti questa domanda: a che ti serve confrontare l'eta' di due persone? Per sapere se una e' piu' vecchia di un'altra. Quindi, un'idea potrebbe essere NON confrontare direttamente le eta', ma implementare qualcosa del tipo:

    bool Persona::ePiuVecchioDi(Persona& altraPersona)

    che ritorna true se la persona corrente e' piu' vecchia dell'altra.
  • Re: Esercizio Classi

    Il costruttore non l'ho creato. Quello è solo un promemoria per ricordarmi di inserire il costruttore. Nel codice scritto da me il costruttore non c'è.
    In merito a questo volevo sapere cosa potrei metterci all'interno del costruttore (ad esempio un controllo sull'età?).

    Il campo eta inizialmente l'avevo messo come privato ma come scritto sopra non riuscivo più ad usarlo (causa ignoranza mia) e l'ho lasciato pubblico proprio per evidenziare il problema che ho e che devo risolvere (cosa che con molto astio, mi sembra, hai fatto).

    La comparazione delle due età sì serve per verificare chi è più giovane (o anziano) ma è una "linea" di codice che non mi interessa in quanto superflua (non sono questi i miei problemi).


    Il punto 4) l'ho capito a metà: adesso (da profano che sono) vorrei scrivere qualcosa di semplice, per vedere come funziona il tutto. Ripeto, non è tanto cosa fa il codice o a cosa serve o per chi, mi interessa proprio colmare le lacune che ho evidenziato nel programma e che tu stesso hai visto.
    Si passi a risolvere la sintassi per poi aggiustare il programma così da funzionare realmente.

    Grazie!
  • Re: Esercizio Classi

    Il costruttore non l'ho creato. Quello è solo un promemoria per ricordarmi di inserire il costruttore. Nel codice scritto da me il costruttore non c'è.
    In merito a questo volevo sapere cosa potrei metterci all'interno del costruttore (ad esempio un controllo sull'età?).
    Si ma in questo caso il promemoria è più lungo di quello che devi ricordarti.
    Il costruttore dovrà avere come argomenti 2 stringhe e un intero per poter inizializzare opportunamente le 3 variabili membro private: nome, cognome ed eta (eta_mod toglila non serve). Se vuoi inserire dati da tastiera, mettili nel main i cin.
    Il costruttore costruisce l'oggetto persona, quale controllo dovresti fare sull'età? O meglio quale controllo potresti fare visto che gli gli unici dati che hai a disposizione oltre all'età sono nome e cognome?
    Il campo eta inizialmente l'avevo messo come privato ma come scritto sopra non riuscivo più ad usarlo (causa ignoranza mia) e l'ho lasciato pubblico proprio per evidenziare il problema che ho e che devo risolvere (cosa che con molto astio, mi sembra, hai fatto).
    E' normale che se provi ad utilizzare un membro privato al di fuori della classe, come hai fatto tu nel main, il codice non compila.
    In teoria c'è un modo per poter utilizzare membri privati al di fuori della classe, si fa con lo specificatore friend, ma se non l'hai mai sentito lascia stare per il momento.
    Il problema può essere aggirato in molti modi, alcune strade percorribili sono:
    - sulla scia di quanto scritto da migliorabile attraverso una funzione membro del tipo bool Persona::eCoetaneaDi(Persona& altraPersona);
    - oppure nello stesso identico modo di come hai fatto tu nel main, ma invocando una funzione membro getEta() in modo da bypassare il fatto che la variabile membro Eta è privata.
  • Re: Esercizio Classi

    @davicos so perfettamente perche' hai fatto certe scelte .
    Adesso, pero', LEGGI e segui le indicazioni che ti sono state date e correggi l'implementazione.

    Altrimenti, se chiedi consigli, e poi non li segui, a che serve?
    Oltre a fare domande per le quali hai la risposta nel post precedente (come usare il costruttore)

  • Re: Esercizio Classi

    Grazie dei consigli. Aiutandomi con il libro e vedendo esempi online ho riscritto il programma.
    Per semplicità ho lasciato solo la variabile "nome".
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    
    class Persona
    {
    
        public:
    
            Persona(string n)
            {
                nome = n;
            }
    
    
            string getNome() const
            {
    
                return nome;
            }
    
            void Stampa_anagrafica()
            {
    
                cout << "Nome Cliente" << endl;
                cout << getNome();
    
            }
    
    
        private:
            string nome;
    
    };
    
    
    
    int main()
    {
        string nome_cli;
    
        cout << "Inserisci nome: ";
        getline(cin, nome_cli);
    
        Persona p(nome_cli);
    
    
        cout << endl;
        p.Stampa_anagrafica();
    
    }

    Nella speranza che questa volta le cose si incastrino bene attendo vostri giudizi.

    Grazie!
  • Re: Esercizio Classi

    Va bene, l'unica cosa nella funzione Stampa_anagrafica() al posto della funzione getNome() puoi anche utilizzare direttamente la variabile membro nome.
  • Re: Esercizio Classi

    Bene vi ringrazio!
Devi accedere o registrarti per scrivere nel forum
7 risposte