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

    [C++] gerarchia di animali (problema gestione pila statica)

    Salve a tutti ho un problema che non riesco a risolvere in questo programa che vi descrivo in poche parole: Il programma vuole gestire una gerarchia di animali; la classe padre (che è anche virtuale in quanto possiede una funzione del tipo "virtual stampa_dati()=0") si chiama animale e in essa sono definite il codice dell'animale e la specie.Poi ci sono 2 classi figlie che sono mammifero e rettile in cui sono definite alcune funzioni "speciali" e dove vi sono ridefinite la funzione virtuale della classe padre. Poi si vuole realizzare un oggetto pila statica in cui vengono pushati i mammiferi che pesano meno di 100 kg e i rettili che sono definiti di tipo "A".Nella realizzazione della gerarchia di animali non ho trovato difficoltà, ma le ho trovate quando devo implementare la classe pila statica; in particolare il compilatore mi da i seguenti errori che proprio non riesco a risolvere; vi posto qui lo spezzone di codice in cui ci sono gli errori e dopo il resto del programma:
    codice:
     In member function `void pila::inserisci_nodo(rettile, mammifero)': 
    no match for 'operator=' in 'p[((pila*)this)->pila::t] = e' 
    no match for 'operator=' in 'p[((pila*)this)->pila::t] = f' 
    
    In member function `void pila::stampa_pila() const': 
    no match for 'operator<<' in 'std::cout << p[i]' 
    
    #ifndef PILAS_H_
    #define PILAS_H_
    
    #include "rettile.h"
    #include "mammifero.h"
    
    #include <iostream>
    using namespace std;
    
    
    class pila{
          
                private:
                        int t;
                        static const int dim=5;
                        
                 
                 public:
                        pila(){t=0;}
                        pila(const pila &);
                        const pila & operator=(const pila &){};
                        void inserisci_nodo(const rettile e,const mammifero f);
                        void stampa_pila()const;
          };
          
    #endif
    
    #include "pila.h"
    #include <iostream>
    using namespace std;
    
    
    
    void pila::inserisci_nodo(const rettile e,const mammifero f)
    {
     pila p[dim];
     if(e.get_tipo()=="A")
      {
       p[t]=e;
       t++;
      } else if(f.get_peso()<100)
        { p[t]=f;
        t++;}
    }
    
    void pila::stampa_pila() const
    {
     pila p[dim];
     cout<<"Gli animali presenti nella pila sono:\n";
     for(int i=0;i<dim;i++)
      cout<<p[i]<<endl;
    }
    Ecco il resto del programma dove è illustrata la realizzazione della gerarchia:

    codice:
    #ifndef ANIMALE_H_
    #define ANIMALE_H_
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class animale{
          
          protected:        
                  string codice;
                  string specie;
                  
          public: 
                  animale(const string c="",const string s="")
                  {codice=c;specie=s;}
                  animale(const animale &);
                  const animale & operator=(const animale & A);
                  virtual void stampa_dati()=0;
          
          
          };
          
    #endif
    
    
    #include "animale.h"
    
    animale::animale(const animale & A)
    {
     this->codice=A.codice;
     this->specie=A.specie;
    }
    
    const animale & animale::operator=(const animale & A)
    {
     if(this!=&A)
     {
      this->codice=A.codice;
      this->specie=A.specie;
     }
     return *this;
    }
    
    
    #ifndef MAMMIFERO_H_
    #define MAMMIFERO_H_
    
    #include "animale.h"
    #include <string>
    
    class mammifero:public animale{
          
          private:
                  float peso;
                  
          public:
                 mammifero(const string c="",const string s="",const float p=0.0):animale(c,s)
                 {peso=p;}
                 mammifero(const mammifero &);
                 const mammifero & operator=(const mammifero &);
                 virtual void stampa_dati();
                 float get_peso() const {return peso;}
          };
          
    #endif
    
    
    #include "mammifero.h"
    
    mammifero::mammifero(const mammifero & M):animale(M)
    {this->peso=M.peso;}
    
    const mammifero & mammifero::operator=(const mammifero & M)
    {
     if(this!=&M)
     {
      animale::operator=(M);
      this->peso=M.peso;
     }
     return *this;
    }
      
     
    
    void mammifero::stampa_dati()
    {
     cout<<"Dati relativi ad un mammifero:\n";
     cout<<"Codice: "<<codice<<"\n";
     cout<<"Specie: "<<specie<<"\n";
     cout<<"Peso: "<<peso<<"\n";
    }
    
    
    #ifndef RETTILE_H_
    #define RETTILE_H_
    
    #include <iostream>
    #include <string>
    #include "animale.h"
    
    using namespace std;
    
    class rettile:public animale{
          
          private:
                  string tipoesemplare;
                  
          public:
                 rettile(const string c="",const string s="",const string t=""):animale(c,s)
                 {tipoesemplare=t;}
                 rettile(const rettile &);
                 const rettile & operator=(const rettile &);
                 virtual void stampa_dati();
                 const string get_tipo() const {return tipoesemplare;}
          
          
          };
    #endif      
    
    #include "rettile.h"
    
    rettile::rettile(const rettile & R):animale(R)
    {this->tipoesemplare=R.tipoesemplare;}
    
    const rettile & rettile::operator=(const rettile & R)
    {
     if(this!=&R)
     {
      animale::operator=(R);
      this->tipoesemplare=R.tipoesemplare;
     }
     return *this;
    }
      
    
    void rettile::stampa_dati()
    {
    cout<<"Codice: "<<codice<<"\n";
    cout<<"Specie: "<<specie<<"\n";
    cout<<"Tipo di esemplare: "<<tipoesemplare<<"\n";
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Non è concettualmente corretta l'implementazione della pila.

    Tu utilizzi un "array di pile" per inserire i singoli elementi di una pila ...

    Devi rivedere l'implementazione della classe pila.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Capisco però siccome mi sono letteralmente perso potresti darmi qualche dritta in più?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Guarda ... esistono tanti esempi su internet di implementazione di una classe pila ... scriverne una adesso non mi pare il caso ...

    Dai un'occhiata e fatti risentire in caso di problemi.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Per fortuna quest' estate ho fatto una classe Stack in c++, puoi prendere spunto dalla mia.
    Però ci sono delle cose sbagliate di cui mi accorgo adesso, ad esempio per aggiungere un elemento scorro tutta la pila e lo aggiungo in fondo, ma il costo dell' inserzione è O(n).
    Dovrebbe essere O(1), lo dovrei aggiungere come primo elemento così mi evito di scorrerla tutta.
    Comunque questa è la classe:
    http://pastebin.com/7m2B7hgr
    Tra l' altro manca anche il distruttore.
    Puoi farne una te tenendo conto di queste cose.

  6. #6
    Io la classe pila statica l'ho già implementata nel caso di interi.Infatti feci così quando la imparai:

    codice:
    #ifndef PILA_H_
    #define PILA_H_
    #include <iostream>
    
    using namespace std;
    
    typedef int E;
    
    class pila{
               private:
                       int t;
                       static const int dim=5;
                       E p[dim];
               
                       
                       
               public:
                      pila(){cout<<"pila inizializzata!\n\n";t=0;}
                      pila(const pila &);
                      const pila & operator=(const pila &){};
                      void push(const E e) {p[t]=e;t++;}
                      void pop(E & e) {t--;e=p[t];}
                      void top(E & e) const {e=p[t-1];}
                      bool research(const E e) const; 
                      bool full()const{return t==dim;}
                      bool empty()const{return t==0;}
               };
    #endif
    Ora tornando al caso della gerarchia di animali quando mi chiede di realizzare una pila statica con le sole funzioni di push e stampa, mi chiede di pushare nella pila mammiferi che pesano meno di 100 kg e rettili di tipo "A"; il mio problema sorge qui :

    codice:
    typedef int E;
    
    class pila{
               private:
                       int t;
                       static const int dim=5;
                       E p[dim];
    Nel caso della pila di interi ho dichiarato nella parte privata un'array statico di dimensione dim di interi.Ora che tipo dovrei dichiarare al posto di int avendo tipi rettile e mammifero?
    Ho provato anche a dichiarare un tipo strutturato con i tipi rettile e mammifero ma in pratica è come se avessi creato un nuovo animale che è sia mammifero che rettile e questo non va bene

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Basta cambiare il tipo di E:

    codice:
    typedef animale E;

  8. #8
    Ho messo il tipo animale come tipo dell'array statico ma trovo ancora difficoltà in quanto il compilatore mi dice che la costante "e" che ho passato non fa parte della classe pila...questo è pure ovvio però davvero non so come andare avanti!

    Qui c'è il codice della pila
    codice:
    #ifndef PILAS_H_
    #define PILAS_H_
    
    #include "mammifero.h"
    #include "rettile.h"
    #include <iostream>
    using namespace std;
    
    typedef animale E;
    
    class pila{
          
                private:
                        int t;
                        static const int dim=5;
                        E p[dim];
                        
                 
                 public:
                        pila(){t=0;}
                        pila(const pila &);
                        const pila & operator=(const pila &){};
                        bool inserisci_nodo(const E e);
                        void stampa_pila()const;
          };
          
    #endif
    
    #include "pila.h"
    #include <iostream>
    using namespace std;
    void pila::inserisci_nodo(const E e)
    {
     if(e.get_peso<100())||(e.get_tipo()=="A")
      p[t]=e;
      t++;
    }
    
    /*void pila::stampa_pila()const
    {
    }*/

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Che errore ti da esattamente? puoi copiarlo e incollarlo?

  10. #10
    vabbè non fa niente grazie lo stesso a tutti per l'aiuto sono riuscito a risolvere

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.