Array di puntatori ad una classe e allocazione dinamica

di il
5 risposte

Array di puntatori ad una classe e allocazione dinamica

Buona sera,
sono nuovo qui e sono un neoprogrammatore (terzo anno istituto tecnico indirizzo informatico) e sto studiando la programmazione ad oggetti, per allenarmi sto facendo alcuni esercizi, ho così realizzato un programma che simula la gestione di un parcheggio (permette di far entrare, uscire, modificare e mostrare le informazioni di più macchine), per fare ciò ho implementato una classe Automobile ed ho dichiarato un vettore di puntatori Automobile* macchine[N_posti] e sembra così funzionare, solo che in alcuni punti, l'eseguibile mi si blocca e appare la classica finestra di windows "Il programma ha smesso di funzionare". I punti in cui mi si blocca sono i seguenti: ad esempio fisso l'array a 3 posizioni e alloco tutte e 3 le posizioni, quando io voglio deallocare una posizione, nel caso deallochi la prima posizione oppure una posizione della quale le sue precedenti sono tutte allocate, allora fila tutto liscio, se invece dealloco ad esempio la terza posizione e la prima e/o la seconda sono state già deallocate, al momento dell'inserimento della targa dell'automobile che voglio far uscire, allora mi si blocca, e così succede se voglio modificare i dati o visualizzare le informazioni di un'automobile. In pratica quindi il programma si blocca quando lavoro su una posizione dell'array della quale almeno una delle sue precedenti posizioni è deallocata.
Spero di essere stato chiaro nell'esporre il mio problema e spero possiate aiutarmi, grazie

Questo è il mio codice:

#include<iostream>
#define N_posti 3
using namespace std;

void stampa_Menu(void);


class Automobile
{
	string targa;
	string categoria;
	string data_in;
	string data_out;
	string ora_in;
	string ora_out;
	int numero_post;
	public:
		void Ingresso(Automobile* macchina[]);
		void Uscita(Automobile* macchina[]);
		void MostraInf(Automobile* macchina[]);
		void Modifica(Automobile* macchina[]);
		void Stampa(Automobile* macchina[]);		
		Automobile()
		{
			targa="";
			categoria="";
			numero_post=0;
		}
};

void Inizializza(Automobile* macchina[]);

void Automobile::Ingresso(Automobile* macchina[])
{
	int i=0;
	while(macchina[i]!=NULL && i<N_posti)
	{
		i++;
	}
	if(i>=N_posti)
	   cout<<endl<<"Parchrggio pieno! \n\n";
	else
    {
	    cout<<"Benvenuto al parcheggio, inserici i dati dell`automobile: \n";
    	macchina[i] = new Automobile;
    	macchina[i]->numero_post = i+1;
	    cout<<"Inserisci la targa: ";
	    cin>>macchina[i]->targa;
	    cout<<endl<<"Inserisci la categoria (utilitaria, berlina, station wagon, monovolume, fuoristrada): ";
	    cin>>macchina[i]->categoria;
	    cout<<endl<<"Inserisci la data di entrata (nel formato gg:mm:aaaa): ";
	    cin>>macchina[i]->data_in;
	    cout<<endl<<"Inserisci l`ora di entrata (nel formato hh:mm) : ";
	    cin>>macchina[i]->ora_in;
	    cout<<endl<<"Il numero di posto assegnato e`: "<<macchina[i]->numero_post;
	    cout<<endl<<endl;
	}
}

void Automobile::Uscita(Automobile* macchina[])
{
	string t="";
	cout<<endl<<"Inserisci la targa dell`automobile in uscita: ";
	cin>>t;
	int i=0;
	int j=0;
	for(int j=0; j<N_posti; j++)
	{
		if(macchina[j]==NULL || macchina[j]->targa!=t)
    	{
		    i++;
	
    	}
	}
	
	if(i>=N_posti)
	{
		cout<<endl<<"Automobile non trovata. \n ";
	}    
	else
	{
		i=0;
		while( macchina[i]->targa!=t)
    	{
		    i++;
    	}
		cout<<endl<<"Inserisci la data di uscita (nel formato gg:mm:aaaa): ";
	    cin>>macchina[i]->data_out;
	    cout<<endl<<"Inserisci l`ora di uscita (nel formato hh:mm): ";
	    cin>>macchina[i]->ora_out;
	    delete macchina[i];
	    macchina[i]=NULL;
	    cout<<endl<<"Automobile uscita. \n";
	    cout<<endl<<endl;
	    

	}
}

void Automobile::MostraInf(Automobile* macchina[])
{
	string t="";
	int i=0;
	cout<<endl<<"Inserisci la targa dell`automobile che vuoi visualizzare: ";
	cin>>t;
	cout<<endl;
	for(int j=0; j<N_posti; j++)
	{
		if(macchina[j]==NULL || macchina[j]->targa!=t)
	   {
	    	i++;
	   }
	}
	
	if(i>=N_posti)
	    cout<<"Automobile non trovata. \n";
    else
	{
		i=0;
		while(macchina[i]->targa!=t)
		{
			i++;
		}
		cout<<"N posto     Targa        Categoria       Data e ora arrivo \n";
		cout<<"-----------------------------------------------------------\n";
		cout<<"   "<<macchina[i]->numero_post<<"     ";
		cout<<macchina[i]->targa<<"            ";
		cout<<macchina[i]->categoria<<"            ";
		cout<<macchina[i]->data_in<<"   "<<macchina[i]->ora_in<<endl;
	}
	cout<<endl<<endl;
}

void Automobile::Stampa(Automobile* macchina[])
{
    cout<<endl<<"N posto     Targa        Categoria       Data e ora arrivo \n";
	cout<<"-----------------------------------------------------------\n";
	int i=0;
	for(int j=0; j<N_posti; j++)
	{
		if(macchina[i]!=NULL)
	    {
	    	cout<<"  "<<macchina[i]->numero_post<<"            ";
	    	cout<<macchina[i]->targa<<"              ";
	    	cout<<macchina[i]->categoria<<"            ";
    		cout<<macchina[i]->data_in<<"   "<<macchina[i]->ora_in<<endl;
     		
	    }
		i++;
	}
	
	cout<<endl<<endl;
}

void Automobile::Modifica(Automobile* macchina[])
{
	int n;
	string c="";
	string t="";
	int i=0;
	cout<<"Inserisci la targa dell`automobile che vuoi modificare: ";
	cin>>t;
	for(int j=0; j<N_posti; j++)
	{
		if(macchina[j]==NULL || macchina[j]->targa!=t)
     	{
         		i++;         		
    	}
	}
	
	if(i>=N_posti)
	    cout<<"Automobile non trovata. \n";
	else
	{
		i=0;
		while(macchina[i]->targa!=t)
		{
			i++;
		}
		cout<<endl<<endl;
		cout<<"Cosa vuoi modificare? \n";
		cout<<"1) Targa \n";
		cout<<"2) Categoria \n";
		cout<<"3) Numero posto \n";
		int s;
		cout<<endl<<"Opzione: ";
		cin>>s;
		switch(s)
		{
			case 1:
				t="";
				cout<<endl<<"Inserisci la nuova targa: ";
				cin>>t;
				macchina[i]->targa=t;
				cout<<endl<<"Targa modificata correttamente. \n \n";
			break;
			case 2:
				c="";
				cout<<endl<<"Inserisci la nuova categoria: ";
				cin>>c;
				macchina[i]->categoria="";
				macchina[i]->categoria=c;
				cout<<endl<<"Categoria modificata correttamente. \n \n";
			break;
			case 3:
				int j=0;
				for(int y=0; y<N_posti; y++)
				{
					while(macchina[j]!=NULL)
			    	{
				    	j++;
	    			}
				}
				
				if(j>=N_posti)
				{
					cout<<endl<<"Il posto che ti e` ststo assegnato e` l`unico disponibile. \n \n";
				}
				else
				{
					cout<<endl<<"Inserisci il numero di posto che desideri: ";
				    cin>>n;
					while(macchina[n-1]!=NULL)
	    			{
	        				cout<<endl<<"Posizione occupata, scegline un`altra: ";
		        			cin>>n;
		    		}
		    		macchina[n-1]= new Automobile;
		    		macchina[n-1]->targa=macchina[i]->targa;
		    		macchina[n-1]->categoria=macchina[i]->categoria;
		    		macchina[n-1]->data_in[10]=macchina[i]->data_in[10];
		    		macchina[n-1]->ora_in[5]=macchina[i]->ora_in[5];
		    		macchina[i]->targa="";
		    		macchina[i]->categoria="";
		    		macchina[i]=NULL;
		    	    delete macchina[i];
		    	    macchina[n-1]->numero_post = n;
		    		cout<<endl<<"Ok, posizione assegnata: "<<macchina[n-1]->numero_post;
		    	 	cout<<endl<<endl;
				}
				
			break;
		}
	}
}


main()
{
	Automobile* m[N_posti];
	Automobile operazione;
	int scelta;
	cout<<"Benvenuti al PARCHEGGIO \n";
    Inizializza(m);
	do
	{
		stampa_Menu();
     	do
	    {
	     	cin>>scelta;
    	}while(scelta<1 || scelta>6);
    	
		switch(scelta)
	   {
		case 1:
			operazione.Ingresso(m);
		break;
		case 2:
			operazione.Uscita(m);
		break;
		case 3:
			operazione.MostraInf(m);
		break;
		case 4:
			operazione.Modifica(m);
		break;
		case 5:
			operazione.Stampa(m);
		break;
	   }
	}while(scelta!=6);
	
   cout<<"Grazie, arrivederci! \n";
	
	system("PAUSE");
	return 0;
}

void stampa_Menu(void)
{
	cout<<"Scegli l`operazone da effettuare: \n";
	cout<<"1) Ingresso nuova auto \n";
	cout<<"2) Uscita auto \n";
	cout<<"3) Informazioni di un`automobile \n";
	cout<<"4) Modifica informazioni di un`automobile \n";
	cout<<"5) Stampa Automobili presenti \n";
	cout<<"6) Esci \n";	
	cout<<endl<<"Opzione: ";
}

void Inizializza(Automobile* macchina[])
{
	for(int i=0; i<N_posti; i++)
	{
		 macchina[i]=NULL;
	}
	  
}

5 Risposte

Devi accedere o registrarti per scrivere nel forum
5 risposte