|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2006
Messaggi: 211
|
[C++] Creare oggetti dinamicamente
Ciao a tutti, ho bisogno di un consiglio:
Ho creato una classe città nella quale inserire i dati di una data città inserita dall'utente, il problema è che vorrei che venisse creato un oggetto città a run time. Ho fatto un menu con switch e in pratica ogni volta che premo 1 vorrei che si creasse un oggetto in cui poter modificare i dati.. come posso fare? Ho visto che si può implementare tramite liste e puntatori o con <vector>, però penso di dover mettere gli oggetti in un array visto che dovrei farci ricerche e modifiche.. spero di essere stato chiaro, grazie |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Detta in c++_ese fai una cosa del tipo: Codice:
contenitore[i] = new Città( /* lista parametri */ ); |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jun 2006
Messaggi: 211
|
Grazie della risposta, però sto cercando di capire come fare un contenitore di puntatori a città, mettiamo caso che usi gli array (purtroppo con i vector non ho mai visto niente) per fare un array di puntatori ad oggetti non mi basta scrivere questo?
Codice:
citta* puntcitta = new citta[100] Ho visto alcuni esempi e viene creato un puntatore a un puntatore ad array di oggetti, però non capisco il perché si debba utilizzare un "doppio" puntatore.. Grazie |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Oct 2010
Città: Savona
Messaggi: 194
|
Se usi Visual Studio 2010 può esserti utile la seguente spiegazione per instanziare un array di classi:
http://msdn.microsoft.com/en-us/library/fs4s9exz.aspx e soprattutto questa: http://msdn.microsoft.com/en-us/library/kewsb8ba.aspx Che dice chiaramente che gli array di oggetti sono semplicemente allocabili con il metodo che hai descritto se la classe degli oggetti ha un costruttore di default: cioè se la classe ha un costruttore senza parametri. Altrimenti devi creare un array di puntatori alla classe che popolerai a mano uno per uno: Codice:
Citta *puntatori[100]; puntatori[i]=new Citta(\*lista parametri costruttore*\);
__________________
AMD Phenom II X6 3Ghz, MB Gigabyte 790xta-ud4 F4A, 4Gb Ram ddr3, HD Segate Barracuda 1T, SV ASUS GTX 560 Ti DirectCu II ,Monitor Philips 1920x1080 led 2 ms, Xbox360 Slim, Tablet Asus Transformer Pad TF300T, Gameboy Advance, Ipod Touch 16Gb Ultima modifica di AllerITA : 26-05-2012 alle 20:26. |
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Quello del quale hai bisogno tu è un array di puntatori a città, cioè una cosa così: Codice:
citta **cities = new citta*[20]; Codice:
citta *cities[20]; Codice:
cities[0] = new citta(....); cities[1] = new citta(....); cities[2] = new citta(....); ecc.... Quote:
Ultima modifica di [Kendall] : 27-05-2012 alle 01:40. |
||
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Oct 2010
Città: Savona
Messaggi: 194
|
Si hai ragione ho fatto un errore mi sono un po perso il titolo del topic.
__________________
AMD Phenom II X6 3Ghz, MB Gigabyte 790xta-ud4 F4A, 4Gb Ram ddr3, HD Segate Barracuda 1T, SV ASUS GTX 560 Ti DirectCu II ,Monitor Philips 1920x1080 led 2 ms, Xbox360 Slim, Tablet Asus Transformer Pad TF300T, Gameboy Advance, Ipod Touch 16Gb |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
No beh mica hai scritto qualcosa di errato, anzi, semplicemente è diverso. Uno è più flessibile ma richiede maggiori attenzioni nella deallocazione, mentre l'altro è più "sicuro", più performante ma richiede di ipotizzare prima la grandezza del vettore di puntatori, cosa che potrebbe non essere sempre ovvia.
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jun 2006
Messaggi: 211
|
Grazie mille
L'unica implementazione che non mi da errore è citta* cities[100], con quella a doppio puntatore mi da gli stessi errori che ho scritto sopra (e infatti è come avevo provato), adesso ho fatto una funzione void creaCitta() in cui uso l'indice per avanzare nell'array ogni volta che creo un nuovo oggetto solamente che dal main non riesco a richiamarla.. nel senso, io ho sempre fatto esercizi in cui si creava l'oggetto nel main (es. citta c1) e poi si richiamava la funzione per ogni oggetto in questo modo: c1.creaCitta(); Qui però non avendo un oggetto specifico già creato ma volendolo creare a run time, come faccio a richiamare la funzione senza che mi dia errore? Se scrivo semplicemente creaCitta() non sa con che oggetto usarla Grazie! |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Oct 2010
Città: Savona
Messaggi: 194
|
Basta che la funzione non sia implementata come metodo della classe cosi:
Codice:
#include <stdio.h>
//include altri header del progetto
CreaCitta(Citta**cites,int indice);
int main()
{
Citta *city[100];
int i;
i=0;
//inizializza vettore city[100] es; for(int j=0; j<100; j++,city[j]=NULL);
//Codice
CreaCitta(city,1);
//Codice
CreaCitta(city,i);
//Codice
//Cancella elementi vettore city es for(int j=0; j<100; j++)
//{ if (NULL !=city[j]) {delete city[j];city[j]=NULL;};}
//Codice
return 0;
}
CreaCitta(Citta * * cities,int indice)
{
//codice
cities[indice]=new Citta(/*lista parametri*/);
//codice
}
__________________
AMD Phenom II X6 3Ghz, MB Gigabyte 790xta-ud4 F4A, 4Gb Ram ddr3, HD Segate Barracuda 1T, SV ASUS GTX 560 Ti DirectCu II ,Monitor Philips 1920x1080 led 2 ms, Xbox360 Slim, Tablet Asus Transformer Pad TF300T, Gameboy Advance, Ipod Touch 16Gb Ultima modifica di AllerITA : 28-05-2012 alle 07:53. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
p.s: in una situazione del genere comunque io ti consiglio di utilizzare una "map" come contenitore. Non avendo particolari motivi per avere le città in ordine ti tornerebbe utile l'associazione key -> value della map, associando alla key "nome città" il value "oggetto città". Questo ti permetterebbe successivamente di poter accedere alle tue città facendo una ricerca per nome, senza dover scorrere tu manualmente l'array. Poi ovviamente dipende tutto dalle necessità che hai nel programma, perchè se necessiti invece di un sistema più flessibile e complesso, con la possibilità per esempio di ordinare le città per numero di abitanti o altro, allora forse è meglio incapsulare il tutto dentro una classe contenitore fatta da te, nella quale implementi a mano la ricerca per nome, i vari algoritmi di ordinamento e tutte le altre funzionalità delle quale necessiti. (E' proprio questo lo spirito della programmazione ad oggetti) Ultima modifica di [Kendall] : 28-05-2012 alle 08:26. |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jun 2006
Messaggi: 211
|
Ok ce l'ho fatta, grazie
Grazie ancora! Ultima modifica di fede121 : 29-05-2012 alle 14:32. |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Oct 2010
Città: Savona
Messaggi: 194
|
ricorda che il vettore arrayCitta[] è un array di puntatori, quindi puoi richiamare un suo metodo con il seguente operatore sui puntatori:
arrayCitta[j]->inserisciCitta(); che in parole povere e' come fare: (*(arrayCitta[j])).inserisciCitta(); poi mi e' venuto in mente che la funzione creaCitta(citta ** cities,int indice); puo' essere aggiunta come metodo statico della classe citta. se la dichiari static puoi sempre richiamarla così nel programma ad es: citta::creaCitta(citta ** cities,int indice); ricordati solo che dentro un metodo statico non puoi mettere nessuna variabile di istanza (se non è anch'essa statica) altrimenti ti da un errore.
__________________
AMD Phenom II X6 3Ghz, MB Gigabyte 790xta-ud4 F4A, 4Gb Ram ddr3, HD Segate Barracuda 1T, SV ASUS GTX 560 Ti DirectCu II ,Monitor Philips 1920x1080 led 2 ms, Xbox360 Slim, Tablet Asus Transformer Pad TF300T, Gameboy Advance, Ipod Touch 16Gb |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:03.




















