Classe pila dinamica

di il
5 risposte

Classe pila dinamica

Voglio realizzare una classe lista dinamica dove gli elementi della lista sono oggetti istanze della classe studente avente semplicemente come attributi il nome ed un numero.

questa è la mia realizzazione:
#include <iostream>
#include <string>

using namespace std;


class studente {
      public:
             studente(string _nome,int _num){setNome(_nome);setNum(_num);}
             void setNome(string _nome){nome=_nome;};
             void setNum(int _num){num=_num;}
             string getNome(){return nome;}
             int getNum(){return num;}
      private:
              string nome;
              int num;
              };
              
              
struct nodo{
       studente elem;
       nodo* prec;
       };
typedef nodo* P;



class pila{
      public:
             pila(){start();};
             void start(){p=0;}
void push(studente e)
{
     P q=new nodo;   <--- ERRORE
     q->prec=p;
     p=q;
     p->elem=e;
}

void pop(studente &e)
{
     P q=p;
     e=p->elem;
     p=p->prec;
     delete q;
}

void stampa(){
    P temp=p;
    while(temp!=NULL){
        cout<<temp->elem.getNome()<<" "<<temp->elem.getNum()<<" ";
        temp=temp->prec;
    }cout<<endl;
}

private:
        P p;
};
int main()
{
    pila p;
    
    studente e("tiziano",10);
    
    p.push(e);
    p.stampa();
    studente x("fabio",9);
    p.push(e);
    p.stampa();
   
    system("pause");
     cout<<"\n\nESTRAZIONE\n\n";
    p.pop(e);
    p.stampa();
    system("pause");
    return 0;
}
all' istruzione P q=new nodo; del metodo push() mi da errore segnalandomi

member function `void pila::push(studente)':
error: no matching function for call to `nodo::nodo()'
note: candidates are: nodo::nodo(const nodo&)

qual è il problema?

5 Risposte

  • Re: Classe pila dinamica

    Come fai ad inizializzare lo studente dentro lo struct nodo se non li passi nessun parametro?
    Ecco un esempio funzionante. Il resto lo devi fare tu.
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    class studente {
    public:
    	studente(string _nome,int _num)
    		:nome(_nome)
    		,num(_num)
    	{}
    	void setNome(string _nome){nome=_nome;};
    	void setNum(int _num){num=_num;}
    	string getNome(){return nome;}
    	int getNum(){return num;}
    private:
    	string nome;
    	int num;
    };
    
    struct nodo
    {
    	nodo(string _nome,int _num)
    	{
    		elem = new studente(_nome,_num);
    		prec = NULL;
    	}
    	~nodo()
    	{
    		delete elem;
    	}
    	studente *elem;
    	nodo* prec;
    };
    typedef nodo * P;
    
    int main(void)
    {
    	P q = new nodo("nome",1);
    	delete q;
    }
    
  • Re: Classe pila dinamica

    Continua a non essermi chiara la situazione.
    Ho bisogno che me la fai capire meglio con un esempio più completo.

    Qua è dove sono arrivato:
    #include <iostream>
    #include <string>
    using namespace std;
    
    class studente {
    public:
       studente(string _nome,int _num)
          :nome(_nome)
          ,num(_num)
       {}
       void setNome(string _nome){nome=_nome;};
       void setNum(int _num){num=_num;}
       string getNome(){return nome;}
       int getNum(){return num;}
    private:
       string nome;
       int num;
    };
    
    struct nodo
    {
       nodo(string _nome,int _num)
       {
          elem = new studente(_nome,_num);
          prec = NULL;
       }
       ~nodo()
       {
          delete elem;
       }
       studente *elem;
       nodo* prec;
    };
    typedef nodo * P;
    
    class pila{
          public:
                 pila(){start();};
                 void start(){p=0;}
    void push(studente e)
    {
         P q=new nodo(e.getNome(),e.getNum());
         q->prec=p;
         p=q;
         p->elem.setNome(e.getNome());
         p->elem.setNum(e.getNum());
    }
    
    void pop(studente &e)
    {
         P q=p;
         e=p->elem;
         p=p->prec;
         delete q;
    }
    
    void stampa(){
        P temp=p;
        while(temp!=NULL){
            cout<<temp->elem.getNome()<<" "<<temp->elem.getNum()<<" ";
            temp=temp->prec;
        }cout<<endl;
    }
    
    private:
            P p;
    };
    
    int main(void)
    {
       
       P q = new nodo("nome",1);
       cout<<s.getNome();
       delete q;
       system("pause");
    }
    
  • Re: Classe pila dinamica

    Nell attesa ho sistemato qualcosa dimmi ke ne pensi:
    #include <iostream>
    #include <string>
    using namespace std;
    
    class studente {
    public:
       studente(string _nome,int _num)
          :nome(_nome)
          ,num(_num)
       {}
       void setNome(string _nome){nome=_nome;};
       void setNum(int _num){num=_num;}
       string getNome(){return nome;}
       int getNum(){return num;}
    private:
       string nome;
       int num;
    };
    
    struct nodo
    {
       nodo(string _nome,int _num)
       {
          elem->setNome(_nome);
          elem->setNum(_num);
          prec = NULL;
       }
     
       studente* elem;
       nodo* prec;
    };
    typedef nodo * P;
    
    class pila{
          public:
                 pila(){start();};
                 void start(){p=0;}
    void push(studente e)
    {
         P q=new nodo(e.getNome(),e.getNum());
         q->prec=p;
         p=q;
         p->elem->setNome(e.getNome());
         p->elem->setNum(e.getNum());
    }
    
    
    
    private:
            P p;
    };
    
    int main(void)
    {
       
       pila p;
        
        studente e("mario",1);
        p.push(e);
       
        
      
        return 0;
       system("pause");
    }
    
    adesso penso ke qualcosa nel metodo push non vada xk in fase di esecuzione mi si blocca tutto.

    come possiamo risolvere questo problema??
  • Re: Classe pila dinamica

    Allora secondo è meglio fare diversamente perche stai faccendo copie di copie di copie. Se vedi tu hai già un studente quindi una istanza della classa studente già creata. Lo devi inserire in una cella (nodo) allora dovresti cambiare il constructor del nodo per accettare tutto lo studente e non solo il nome e la posizione. Qualcosa come questa.
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    class studente {
    public:
       studente(string _nome,int _num)
          :nome(_nome)
          ,num(_num)
       {}
       studente(){} //constructor vuoto serve allo struct nodo x definire l'elemento
       
       studente& operator=(const studente& rhs) // assegnazione, l'elemento dello struct nodo viene riempito quì.
    	{
    		nome = rhs.nome;
    		num = rhs.num;
    		return *this;
    	}
    
       void setNome(string _nome){nome=_nome;};
       void setNum(int _num){num=_num;}
       string getNome(){return nome;}
       int getNum(){return num;}
    private:
       string nome;
       int num;
    };
    
    struct nodo
    {
       nodo(const studente & e)
       {
          elem = e;
          prec = NULL;
       }
       ~nodo()
       {
       }
       studente elem;
       nodo* prec;
    };
    typedef nodo * P;
    
    class pila{
          public:
                 pila(){start();};
                 void start(){p=0;}
    void push(studente e)
    {
         P q=new nodo(e);
         q->prec=p;
         p=q;
    }
    
    void pop(studente &e)
    {
         P q=p;
         e=p->elem;
         p=p->prec;
         delete q;
    }
    
    void stampa(){
        P temp=p;
        while(temp!=NULL){
            cout<<temp->elem.getNome()<<" "<<temp->elem.getNum()<<" ";
            temp=temp->prec;
        }cout<<endl;
    }
    
    private:
            P p;
    };
    
    int main(void)
    {
       studente st("nome",1);
       pila miaPila;
       miaPila.push(st);
       miaPila.stampa();
       
       system("pause");
    }
    
  • Re: Classe pila dinamica

    Abbiamo risposto in contemporanea. ti spiego l'errore da te commesso nello struct nodo
    
    nodo(string _nome,int _num)
       {
          elem->setNome(_nome);
          elem->setNum(_num);
          prec = NULL;
       }
    ...........
    
    elem è un puntatore NULL quindi appena fai setNome andrebbe in tilt il programma.
Devi accedere o registrarti per scrivere nel forum
5 risposte