| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  26-05-2007, 17:27 | #1 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
				
				[c++] Utilizzo  new con Class, dubbi.
			 
		ciao a tutti, sono qui per esporvi un dubbio che mi sta bloccando. Ho appena "concluso" lo studio delle proprietà e le modalità di uso della OOP. Tutto contento ho provato a fare un esercizio serio..e mi sono inchiodato praticamente all'istante. Ecco il dubbio (tranquilli non riporto l'esercizio!). Se io creo nuovi oggetti Class con "new"... poi come faccio a ritrovarli? Esempio banale: Codice: while (condizione) {
Classe *puntatore = new Classe;
...qui lavoro sulla mia classe inserendo quello che mi pare...
}Come si fa a realizzare il tutto in modo sobrio? Davvero, non riesco ad arrivarci. Pensavo servissero gli iteratori per questa cosa..ma oltre alle stack, list, queue e set, non so come usarli! Grazie a chi mi aiuterà. 
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre Ultima modifica di D3stroyer : 26-05-2007 alle 17:29. | 
|   |   | 
|  26-05-2007, 19:15 | #2 | 
| Senior Member Iscritto dal: Jul 2002 Città: Reggio Calabria -> London 
					Messaggi: 12112
				 | 
		ehmmm.. ma così vedi che stai creando sempre una sola instanza di Classe che poi alla fine del ciclo scompare. Per mantenere TUTTI gli oggetti anche alla fine del ciclo dovresti aggiungere questi oggetti ad un array o ad una lista dichiarati all'esterno del ciclo. Ti consiglio di capire per bene il concetto di visibilità delle variabili e di località   
				__________________   | 
|   |   | 
|  26-05-2007, 20:05 | #3 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
		non c'è qualche guida che mi mostri come ci si muove in un programma decente ad oggetti? non libri perchè in quelli che ho letto si parla tanto, ma non si mostra nulla! comunque hai ragione, ho detto una vera cazzata ma se mi scriveste qualche esempio ve ne sarei grato (esempio dove il programma deve crearsi nuovi oggetti classe e deve tenerseli in memoria). 
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre Ultima modifica di D3stroyer : 26-05-2007 alle 20:08. | 
|   |   | 
|  27-05-2007, 12:06 | #4 | |
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | Quote: 
 Codice: vector<Classe*> vClassi;
while (condizione) {
Classe *puntatore = new Classe;
...qui lavoro sulla mia classe inserendo quello che mi pare...
vClassi.push_back(puntatore);
}
//Alla fine di tutto, per dellocare:
vector<Classe*>::iterator it;
for (it = vClassi.begin(); it != vClassi.end(); it++)
{
    delete (*it);
}
vClassi.clear();Ultima modifica di tomminno : 27-05-2007 alle 12:11. | |
|   |   | 
|  27-05-2007, 13:09 | #5 | 
| Senior Member Iscritto dal: Nov 2004 Città: Tra Verona e Mantova 
					Messaggi: 4553
				 | 
		Prova a lanciarti in un esercizio che abbia un senso. Perchè alla fine la ragione del new è tutta qui. Una volta ad un corso diedi questo. Sei al supermercato col tuo bel carrello di schifezze. Arrivi alla cassa allo scopo di perfezionare l'acquisto delle merci. Descrivi il fenomeno "acquisto delle merci nel carrello in un supermercato" e poi rappresentalo nei termini usati per la descrizione. L'unica cosa che potrebbe apparire aliena, ma non lo è una volta che si conosca, è la necessità di definire un contesto. Che, tra l'altro, risponde alle domande "ma come faccio ad accedere agli oggetti che creo" e, soprattutto, "ma perchè diavolo dovrei aver bisogno di sapere quali oggetti ho creato".
		 
				__________________ Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! | 
|   |   | 
|  27-05-2007, 22:31 | #6 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
		
wow, questo mi suona familiare anche se non so usare le vector (me le studio subito   ). Grazie, l'esempio sembra azzeccatissimo. @PGI: domani provo a rileggere attentamente perchè attualmente mi sono arrotolato tra le righe e non ci ho capito nulla  grazie a tutti per ora   
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre | 
|   |   | 
|  30-05-2007, 21:13 | #7 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
		allora..non riesco a far funzionare il metodo di tommino. vorrei fare una cosa simile.. Codice: #include <iostream>
#include <vector>
using namespace std;
class classe {
      public:
      classe() {};
      ~classe() {};
      int numero;
      };
      
vector<classe*> vClassi;
int main( ) {
    int i = 0;
    while (i < 5) {
    classe *puntatore = new classe;
    cin >> puntatore->cane;
    vClassi.push_back(puntatore);
    i++;
    }
    
   vector<classe*>::iterator it;
   for (it = vClassi.begin(); it != vClassi.end(); it++) {
   cout << Qui cosa scrivo se voglio in cout il numero dentro ad ogni classe? << endl;
   }
    
}
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre | 
|   |   | 
|  30-05-2007, 21:38 | #8 | |
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | Quote: 
 Codice: cin >> puntatore->cane; poi gli iteratori sono puntatori, quindi it è un puntatore a un puntatore a Classe, a te cercare la soluzione. | |
|   |   | 
|  30-05-2007, 22:12 | #9 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
		davvero, non ci arrivo, ho provato anche a fare il disegnino dello schema che si crea ma in quel cout non riesco a non farmi dare errori! non badare a cane, era un errore di copiaincolla. Era numero invece di cane. Ragionando ho questa idea: vClassi è un contenitore di puntatori a classe quindi contiene gli indirizzi dei puntatori che puntano alle classi stesse...ossia gli indirizzi a "puntatore" (come l'ho chiamato nel programma). Quindi in teoria dovrei entrare in it->puntatore->numero; ma nemmeno così funziona..quindi c'è un problema mio di incomprensione e non capisco qual'è!  edit!!! forse inizio a capire..ma ancora non va Codice: #include <iostream>
#include <vector>
using namespace std;
class classe {
      public:
      classe() {};
      ~classe() {};
      int numero;
      };
      
vector<classe*> vClassi;
int main( ) {
    int i = 0;
    while (i < 5) {
    classe *puntatore = new classe;
    cin >> puntatore->numero;
    vClassi.push_back(puntatore);
    i++;
    
    
    }
    
   vector<classe*>::iterator it;
   for (it = vClassi.begin(); it != vClassi.end(); it++) {
   classe* ptr = vClassi.front();
   cout << ptr->numero << endl;
   }
    
}in input do 1, 2, 3, 4, 5...ma in cout continua a darmi 1!...perchè? 
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre Ultima modifica di D3stroyer : 30-05-2007 alle 22:22. | 
|   |   | 
|  30-05-2007, 22:29 | #10 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
		ok, sono riuscito, ma è un metodo veramente brutto e deve esserci un modo elegante di fare la stessa cosa...ditemelo se c'è, per favore! incollo solo la parte finale che ho usato per risolvere. Codice: int main( ) {
    int i = 0;
    while (i < 5) {
    classe *puntatore = new classe;
    cin >> puntatore->numero;
    vClassi.push_back(puntatore);
    i++;
    
    
    }
    
   vector<classe*>::iterator it;
   int g = 0;
   for (it = vClassi.begin(); it != vClassi.end(); it++) {
   cout << vClassi.at(g)->numero << endl;
   g++;
   }
    
} comunque grazie, fin'ora mi avete aiutato bene. 
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre | 
|   |   | 
|  31-05-2007, 00:20 | #11 | ||
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | Quote: 
 "puntatore" è solo un nome di variabile il cui scope è il primo while, "puntatore" contiene un indirizzo di memoria che viene copiato sul vettore tramite il metodo push_back, fuori dallo while per riferirti a quel particolare indirizzo d memoria devi ricorrere all'elemento del vettore non più a "puntatore" che in quanto variabile è già stata distrutta all'uscita dello while. Quote: 
 | ||
|   |   | 
|  31-05-2007, 00:20 | #12 | |
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | Quote: 
 La soluzione è banale, prova con: Codice: cout << (*it)->numero << endl; | |
|   |   | 
|  31-05-2007, 00:28 | #13 | 
| Senior Member Iscritto dal: Dec 2003 
					Messaggi: 3567
				 | 
		MWAHAHAHAHAHAH, finalmente..tutto è chiaro. Perfetto. Avevo un'idea degli iteratori completamente sbagliata e non avevo evidentemente ben inquadrato il concetto di contenitore. Ottimo, sono apposto, mi hai risolto un problema chiave (ho anche scritto tante fesserie però). grazie davvero. edit: si, ora ho tutti i mezzi, vi ringrazio siete stati mitici, soprattutto tomminno. ho risolto il tema d'esame che non potevo fare prima! 
				__________________ Intel Core 2 Duo E6300 @ 3.00GHz / Gigabyte P965 DS4 / 2xTEAM GROUP TVDD1024M800 / Gainward GTX460 GS 1GB   Barracuda 7200.11 SataII 500Gb + Maxtor ATA320Gb + Hitachi SataII 320Gb / Enermax Noisetaker 495W Il miglior topic di sempre Ultima modifica di D3stroyer : 31-05-2007 alle 12:11. | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 18:59.









 
		 
		 
		 
		









 
  
 



 
                        
                        










