Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Polimorfismo

    salve.. non sono mai riuscito a capire bene come funziona il polimorfismo con le sue classi virtuali.. ho un esercizio di un appello di un esame che non sono mai riuscito a capirlo.. l'esercizio è il seguente:

    progettare la/le classi Componente (solo intestazione) in modo da consentire la configurazione di un impianto con i più comuni componenti(TV, amplificatore, ecc) e da essere flessibile in caso di aggiunta di nuovi componenti..

    mi serve dunque solo l'intestazione delle classi, ma non riesco a capire come impostare un modo per poter aggiungere nuovi componenti..

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quali sono le operazioni comuni di ogni elettrodomestico? Attaccarlo alla spina, accenderlo e spegnerlo. Tralasciando per un attimo la prima delle tre, l'interfaccia può essere di soli due metodi (tre con il distruttore virtuale per obbligo del linguaggio).
    codice:
    struct Elettrodomestico {
        virtual void accendi()=0;
        virtual void spegni()=0;
        virtual ~Elettrodomestico() {}
    };
    Da questa interfaccia derivi quello che hai bisogno:
    codice:
    struct TV : public Elettrodomestico {
        void accendi() { puts("Ho acceso la TV"); }
        void spegni() { puts("Ho spento la TV"); };
        ~TV () {}
    };
    
    struct Phon : public Elettrodomestico {
        void accendi() { puts("Ho acceso il phon"); }
        void spegni() { puts("Ho spento il phon"); };
        ~Phon () {}
    };
    
    ... 
    TV tv;
    Phon phon;
    
    Elettrodomestico* apparecchio = &tv;
    apparecchio->accendi();
    apparecchio->spegni();
    
    Elettrodomestico* apparecchio = &phon;
    apparecchio->accendi();
    apparecchio->spegni();
    Ora resta da attarli alla spina.
    codice:
    Elettrodomestico* spina_elettrica[2];
    spina_elettrica[0] = &tv;
    spina_elettrica[1] = &phon;
    
    spina_elettrica[0]->accendi();
    spina_elettrica[0]->spegni();
    
    spina_elettrica[1]->accendi();
    spina_elettrica[1]->spegni();
    Servono altri apparecchi? Ripeti la derivazione e lo attacchi a una nuova spina.
    Questo a enormi linee.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    a me servirebbe la dichiarazione del metodo che permette di aggiungere nuovi componenti o modificarne di esistenti.. Provo ad abbozzare io qualcosa..
    codice:
    Class Base
    {
          public:
                   virtual void aggiungiComponente(string s)=0;
                   virtual void modificaComponente(string s)=0;
    }
    
    Class Componente: public Base
    {
          public:
                   void aggiungiComponente(string s);
                   void modificaComponente(string s);
          private:
                    vector<string> componenti; //vettore contenente l'insieme dei componenti
    }
    Così va bene? conta che non mi serve al definizione dei metodi, ma solo dichiarazione

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non hai capito: è l'impianto a essere un insieme di componenti. E deve essere il componente a implementare l'interfaccia comune a tutti.

    codice:
    class Componente {
        public:
            virtual void metodo1();
            virtual void metodo2();
    };
    
    class Impianto {
        public:
            void aggiungi(Componente*);
            void modifica(Componente*);
            void togli(Componente*);
        private:
            vector<Componenti*> comp;
    };
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    ok forse ci sono.. non mi serve derivare la classe componente, mi basta includerla nella classe impianto e da li aggiungere/togliere/modificare il tutto.. se è così, ero proprio fuori strada fin dal principio :\

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.