[C++]Pila con polimorfismo

di il
4 risposte

[C++]Pila con polimorfismo

Ho una classe base Veicolo. E due classi derivate Auto e Moto. Devo realizzare una pila che contiene sia auto che moto, dunque devo usare il polimorfismo ma non so come realizzarlo nella push. Mi aiutate a definire l'implementazione della push?

struct Nodo{
Veicolo* v=NULL;
Nodo*next=NULL;
}

class Pila{
      Nodo*testa;
public:
Pila(){testa=NULL;}

~Pila(){ Nodo*n=testa; while(n){ testa=testa->next; delete n; n=testa;}

void push(){
do{
Nodo* x=new Nodo; int i;
cout<<"Auto o Moto";
cin>>x;
}while(x!=1&&x!=2&&x!=0);
switch(x){
case 1:break; //dovrei dare al puntatore v l'indirizzo di memoria di un oggetto auto
case 2:break;//qua la moto
case 0: break;
}
};
il mio problema è che non so come fare... se creo un oggetto locale poi alla fine della push viene distrutto, se creo un oggetto con la new non me lo fa dare come valore al puntatore v. Cosa devo fare?

4 Risposte

  • Re: [C++]Pila con polimorfismo

    Intanto dovresti portare la logica di scelta fuori dal metodo push(), per questioni di compentenze.
    E poi dovresti ricordare che un puntatore a una classe base può puntare a qualsiasi classe derivata. Pertanto un puntatore a Veicolo può puntare a un'istanza di Auto o Moto (sempre ammesso che Auto e Moto derivino da Veicolo).
  • Re: [C++]Pila con polimorfismo

    Perché non posso realizzarla nel modulo la scelta? che vuol dire questioni di competenze? E come devo fare altrimenti?
    Io l'ho fatto così il codice ma non funziona e non capisco come devo fare
    
    struct Nodo{
    Veicolo* v=NULL;
    Nodo*next=NULL;
    }
    
    class Pila{
          Nodo*testa;
    public:
    Pila(){testa=NULL;}
    
    ~Pila(){ Nodo*n=testa; while(n){ testa=testa->next; delete n; n=testa;}}
    
    void push(){
    do{
    Nodo* x=new Nodo; int i;
    cout<<"Auto o Moto";
    cin>>x;
    }while(x!=1&&x!=2&&x!=0);
    switch(x){
    case 1: Auto a; cin>>a; x->v=&a; break; 
    case 2:Moto m; cin>>m; x->v=&m; break;
    case 0: break;
    	if(testa==NULL&&x!=0){
    		testa=k;
    		testa->next==NULL;
    	}else if(testa!=NULL&&x!=0){
    		testa->next=testa;
    		testa=k;
    	}
    }
    };
    
  • Re: [C++]Pila con polimorfismo

    Semplicemente significa che l'unica cosa che dovrebbe fare la push è inserire il nodo. Tutto il resto, ossia la scelta di cosa creare andrebbe fatto fuori da quella funzione. Questo significa "questioni di competenze". E' comunque qualcosa che si impara col tempo, quindi non ci pensare troppo.
    Per il resto del codice vedo molta confusione (x usate due volte, una come nodo, una come intero, una k comparsa chissà da dove).
    Quel che devi fare è semplicemente (in pseudo codice):
    
    Nodo* nodo = new Nodo;
    if (voglio auto)
        nodo->v = new Auto; 
    
    if (voglio moto)
        nodo->v = new Moto;
    
  • Re: [C++]Pila con polimorfismo

    In realtà vista l'ora ho copiato il codice da un programma velocemente e non ho controllato se le variabili avevano lo stesso nome
    cmq se serve a qualcuno la posto corretta:
    
    //includere i vari header e namespace 
    struct Nodo{
    Veicolo* v=NULL;
    Nodo*next=NULL;
    }
    
    class Pila{
          Nodo*testa;
    public:
    Pila(){testa=NULL;}
    
    ~Pila(){ Nodo*n=testa; while(n){ testa=testa->next; delete n; n=testa;}}
    
    void push(Veicolo *w){
    Nodo* k=new Nodo;
    k->v=w;
       if(testa==NULL){
          testa=k;
          testa->next==NULL;
       }else{
          k->next=testa;
          testa=k;
       }
    }
    };
    nella pila ho eliminato la switch nella push come mi hai suggerito e quindi ho messo come argomento il puntatore alla classe base
    
    //main
    #include "Auto.h"
    #include "Moto.h"
    #include "Veicolo.h"
    #include "Pila.h"
    ecc.
    
    int main(){
    	Veicolo *w;int i;Pila x; 
    	do{
    		cout<<"1.Auto,2.Moto,0.Uscire: ";
    		cin>>i;
    		if(i==1){
    			Auto* p=new Auto; cin>>p; w=p; x.push(w); 
    		}
    		if(i==2){
    			Moto* a=new Moto; cin>>a; w=a; x.push(w);
    		}
    		if(i!=1&&i!=2&&i!=0){
    			cout<<"Valore non corretto"<<endl;
    		}
    	}while(i!=0);
    	x.print();
    	cout<<"-------------------"<<endl;                    
           system("PAUSE");
           return 0;
    }
    
    adesso dovrebbe essere corretto, no?
    Grazie mille per l'aiuto e auguri di natale
Devi accedere o registrarti per scrivere nel forum
4 risposte