Poliformismo esercizio

di il
9 risposte

Poliformismo esercizio

Ciao a tutti,
Ho fatto un piccolo esercizio sul polifomismo per vedere se ho capito il concetto.
Potete guardarlo e dirmi se va bene? Consigli?

https://docs.google.com/open?id=0BykFbgXzldBVNHdYTHo2S0xPSGc

Grazie
Lele

9 Risposte

  • Re: Poliformismo esercizio

    Ciao ti conviene se posti il codice, sempre se non è tanto. Se metti il link a una risorsa esterna che si deve scaricare e decomprimere, allunghi le cose e la gente perde interesse a vedere di che si tratta.
  • Re: Poliformismo esercizio

    Ciao
    Sono 3 .h e 4 .cpp di per se il codice non è tanto è x questo che lo messo su doc, se è un problema ve lo posto fammi sapere
    Lele
  • Re: Poliformismo esercizio

    Ok vi allego il codice, ditemi che ne pensate.
    Lele

    valoribase.h
    #ifndef VALORIBASI_H
    #define VALORIBASI_H
    #include <iostream>
    using std::cout;
    using std::endl;
    
    class valoriBasi
    {
    public:
        valoriBasi(int val01, int val02 );
        void setPrimo ( int val01 );
        void setSecondo ( int val02 );
    
        int getPrimo() const;
        int getSecondo() const;
    
        virtual void visualizza() const;
    private:
        int primo;
        int secondo;
    };
    
    #endif // VALORIBASI_H
    
    ValoriBasi.cpp
    #include "valoribasi.h"
    
    // inizializza i valori
    valoriBasi::valoriBasi(int val01, int val02)
    {
        setPrimo(val01);
        setSecondo(val02);
    }
    
    // inizializza il primo valore
    void valoriBasi::setPrimo(int val01){
        primo = val01;
    }
    
    // inizializza il secondo valore
    void valoriBasi::setSecondo(int val02){
        secondo = val02;
    }
    
    // visualizza i valori della ClasseBase
    void valoriBasi::visualizza() const {
        cout << "Valori basi\n";
    
        cout << "Primo valore = " << getPrimo () << endl;
        cout << "secondo valore = " << getSecondo () << endl;
    }
    
    // recupera il primo valore
    int valoriBasi::getPrimo() const{
        return primo;
    }
    
    // recupera il secondo valore
    int valoriBasi::getSecondo() const{
        return secondo;
    }
    
    valoreMoltiplicazione.h
    #ifndef VALORIMOLTIPLICAZIONE_H
    #define VALORIMOLTIPLICAZIONE_H
    #include "valoribasi.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    
    class valoriMoltiplicazione : public valoriBasi
    {
    public:
        valoriMoltiplicazione(int &val01, int &val02);
        int getMoltiplicazione() const;
        virtual void visualizza() const;
    };
    
    #endif // VALORIMOLTIPLICAZIONE_H
    
    valoriMoltiplicazione.cpp
    #include "valorimoltiplicazione.h"
    
    // inizializza la classe ValoriBasi e valoriMoltiplicazione
    valoriMoltiplicazione::valoriMoltiplicazione(int &val01, int &val02)
        :valoriBasi(val01, val02)
    {
    }
    
    // somma i valori della classe valoriMoltiplicazione
    int valoriMoltiplicazione::getMoltiplicazione () const{
        return valoriBasi::getPrimo () * valoriBasi::getSecondo ();
    }
    
    // mostra la fuzione visualizza di ValoriBase e valoriMoltiplicazione
    void valoriMoltiplicazione::visualizza () const{
        valoriBasi::visualizza ();
        cout << "Valore moltiplicato = " << getMoltiplicazione () << endl;
    }
    
    voloriSomma.h
    #ifndef VALORISOMMA_H
    #define VALORISOMMA_H
    #include "valoribasi.h"
    
    class valoriSomma : public valoriBasi
    {
    public:
        valoriSomma (int &val01, int &val02);
        int getSomma() const;
        virtual void visualizza() const;
    };
    
    #endif // VALORISOMMA_H
    
    valoriSomma.cpp
    #include "valorisomma.h"
    
    // inizializza la classe ValoriBasi e ValoriSomma
    valoriSomma::valoriSomma(int &val01, int &val02)
        : valoriBasi(val01, val02)
    {
    }
    
    // somma i valori della classe valoriBase
    int valoriSomma::getSomma () const {
        return valoriBasi::getPrimo () + valoriBasi::getSecondo ();
    }
    
    
    // mostra la fuzione visualizza di ValoriBase e ValoriSomma
    void valoriSomma::visualizza () const{
        valoriBasi::visualizza ();
        cout << "Valori sommati " << getSomma () << endl;
    }
    
  • Re: Poliformismo esercizio

    Ciao IpChancellor,
    direi che va bene (a parte l' uso di '&' nel costruttore delle classi derivate che non serve a niente, ma questo ha poca importanza)

    Ora per far vedere che hai capito tutto perfettamente dovresti scrivere un esempio in cui istanzi ed usi queste classi.
  • Re: Poliformismo esercizio

    IO pensavo a una cosa simile
    Grazie
    lele

    main.cpp
    #include "valoribasi.h"
    #include "valorimoltiplicazione.h"
    #include "valorisomma.h"
    
    #include <iostream>
    using std::cout;
    using std::endl;
    
    int main(int argc, char *argv[])
    {
    // Crea un puntatore nullo
        valoriBasi *nXPtr;
    
    // inizializza i valori
        int val01 = 2;
        int val02 = 3;
    
    // inizializza l'oggetto valoriBase
        valoriBasi nValoriBasi(val01, val02);
    
    // collega il puntatore
        nXPtr = &nValoriBasi;
    
    // visualizza i valori
        cout << "nXPtr->visualizza (); ";
        nXPtr->visualizza ();
        cout << endl;
    
    // Inizializza e calcola i valori
        valoriSomma nSomma (val01, val02);
        valoriMoltiplicazione nMolticazione (val01, val02);
    
    // collega il puntatore
        nXPtr = &nMolticazione;
    
    // visualizza i valori
        nXPtr->visualizza ();
        cout << endl;
    
    // collega il puntatore
        nXPtr = &nSomma;
    
    // visualizza i valori
        nXPtr->visualizza ();
        cout << endl;
    }
    
  • Re: Poliformismo esercizio

    Perfetto! Hai capito il polimorfismo, in particolare il fatto che si usa tramite un puntatore alla classe base.

    (nota poco importante, il commento creo un puntatore nullo non è vero perchè non lo metti a NULL, se non assegni niente è indefinito, una buona prassi è inizializzarlo sempre quando lo dichiari, meglio ancora se lo dichiari più sotto nel punto in cui cominci a usarlo)
  • Re: Poliformismo esercizio

    una buona prassi è inizializzarlo sempre quando lo dichiari
    Vuoi una cosa di questo gerene?
    valoriBasi *nXPtr = NULL;
    a parte l' uso di '&' nel costruttore delle classi derivate che non serve a niente
    Perché? nel mio libro utilizzava il riferimento per passare il valore.

    Al massimo ti metto in doc il programma del libro.
    Grazie
    Lele
  • Re: Poliformismo esercizio

    Ciao IpChancellor,

    IpChancellor ha scritto:


    Vuoi una cosa di questo gerene?
    valoriBasi *nXPtr = NULL;
    Si intendevo proprio questo, ancora meglio se poi la dichiari e la inizializzi nel punto in cui cominci ad usarla (più in giù nel codice):
    
    valoriBasi *nXPtr = &nValoriBasi;;
    
    Non è una mia idea lo suggersce lo Stroustrup in the 'C++ programming language', in pratica consiglia di abbandonare la prassi di dichiarare le variabili in alto, all' inizio della funzione, ma dichiararle (e inizializzarle) dove vengono usate.

    La faccenda del passaggio per indirizzo non è molto importante, però ti impedisce ad esempio di scrivere
    
    valoriBasi nValoriBasi(3, 5);  // qui segnalerà errore di compilazione
    
    Seplicemente puoi togliere gli '&' (a meno che tu abbia qualche motivo per passare quei valori per indirizzo).

    Però tutto questo non c' entra col polimorfismo che andava benone!
  • Re: Poliformismo esercizio

    Ok Grazie, continuerò con il mio libro e poi inizierò con le Qt.
    Tutte le volte che dico vorrei fare questo o quello con il c++ mi dicono "dovresti pensare a qualcosa di alto livello" quindi ci adattiamo ....
    grazie di tutto
    lele
Devi accedere o registrarti per scrivere nel forum
9 risposte