Newsgroup: it.comp.lang.c++
Titolo: Dubbi vari, necessito aiuto urgente vi prego

Ho alcuni dubbi da sottoporvi. Chiedo scusa se ciò che sto per dirvi può
sembrarvi troppo banale, purtroppo il mio livello è questo ma sto cercando
di migliorare.
Il primo riguarda le funzioni virtuali. Ho provato a dichiarare nella classe
veicolo una funzione virtuale modifica. La stessa funzione è dichiarata
virtuale in tutte le sottoclassi di veiocolo come Auto, Moto ecc. Ovviamente
bastava dichiarare la funzione virtuale in veiocolo per fare in modo che
fosse virtuale in tutte le sottoclassi.
In un'altra classe ho creato un puntatore di veicoli dichiarato in questo
modo:
Veicolo *veicoli;
a questo puntatore vado piano piano aggiungendo riferimenti a veicolo(che
possono essere auto, moto ecc) tramite questa funzione:
void Simulatore::addVeicolo(Veicolo &v){
 Veicolo *tmp=veicoli;
 vsize+=1;
 veicoli = new Veicolo[vsize];
 for(int i=0; i<vsize-1; i++)
  veicoli[i]=tmp[i];
 veicoli[vsize-1]=v;
 delete[] tmp;
}
La funzione funziona correttamente il problema nasce se voglio richiamare la
funzione polimorfica modifica, infatti se provo a fare una cosa del genere:
veicoli[i]->modifica() mi vengono dati questi errori:
 error C2819: il tipo "Veicolo" non ha un membro "operator ->" di overload
 vedere la dichiarazione di "Veicolo"
        si intendeva utilizzare "."?
 error C2227: l'elemento a sinistra di "->modifica" deve puntare a una
classe, struttura o unione
        il tipo è "Veicolo"
        si intendeva utilizzare"."?
Se faccio questo veicoli[i].modifica(9 mi viene chiamata la funzione
modifica della superclasse veicolo perdendo la caratteristica della funzione
polimorfica.
Se invece dichiaro questo:
Veicolo *veicoli[20]//potevo mettere qualsiasi numero;
a questo punto posso fare veicoli[i]->modifica();
Perchè questo comportamento differente.
Secondo dubbio, se volessi cancellare un elemento da veicoli avendo
istanziato un puntatore a veicoli come nel primo caso come posso fare?
Se lo implemento in questo modo:
void Simulatore::delVeicolo(int k){
veicolo[k]=0;
}
Mi viene ritornato questo errore:
error C2679: "=" binario: non è stato trovato alcun operatore che accetti un
operando destro di tipo "int". È anche possibile che non vi siano
conversioni accettabili
Come risolverlo.
Terzo dubbio. In una classe ho dichiarato:
char *nome;
Ed ho implementato senza particolari problemi i seguenti metodi, ma se
dichiaro char nome[30]; e dichiaro il metodo getName() nella stessa maniera
senza cambiare una virgola, mi viene dato un errore ma se tolgo il const
tutto torna a funzionare. L'erroe che mi viene dato è impossibile convertire
char[30] in char*. Come posso fare a mettere il const
void Persona::setNome(char *n){
 int i=static_cast<int>(strlen(n));
 nome = new char[i+1];
 strcpy(nome, n);
}
char* Persona::getNome()const{
 return nome;
}
Ultimo dubbio. In molte classi ho fatto l'overload degli operatori >> e <<.
In una classe ho fatto l'overload di >> e in questo overload io prendo degli
int e un oggetto Attore, cioè io ho provato a fare una cosa del genere:
istream &operator>>(istream &in, Film &f){
int i;
Attore a;
in>>i;
in>>a;
f.setXXX(i);
f.addAttore(a);
}
Ho provato ma mi viene dato un errore al momento dell'esecuzione. Nella
classe attore l'overload dell'operatore>> è stato fatto. Posso fare una cosa
del genere? Oppure devo far prendere uno per uno i dati di attore settarli
in attore e poi passare questo a film?
Grazie e scusatemi.

 Ho provato ma mi viene dato un errore al momento dell'esecuzione.
Scusa, ma se non dici _che_ errore... magari uno riesce a capire che 
errore c'e' anche semplicemente guardando questo, ma di media non siamo 
veggenti :)
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */