Newsgroup: it.comp.lang.c++
Titolo: Come fa Gesù a diventare Adulto? :-)

Salve.
Ho intenzione di scrivere un programma OOP per scopi autodidattici. Ho
abbastanza chiare le cose basilari dell'OOP. Le cose un po' più
complesse, invece, le ho già studiate e comprese una volta, tempo fa, ma
poi, per mancanza di esercizio, le ho dimenticate. :o)
Quel che mi interessa adesso è una questione che pare banale. Nel mio
programma, ci sarebbe - dico per dire - la classe Persona con
determinate caratteristiche, la classe Bambino e quella Adulto, entrambe
classi ereditate da Persona, con altre caratteristiche.
Ora, nel mio programma ci sarebbe un certo punto in cui, ovviamente :),
l'istanza Bambino diventa Adulto.
Ricordo che c'erano due termini tecnici per indicare l'assegnazione di
un'istanza di una classe ad un'istanza di una classe che eredita da
essa, e viceversa.
Ovviamente, in quel caso veniva spiegato che l'assegnazione
IstanzaClasseFiglia = IstanzaClassePadre era "meno rischiosa", dato che
la prima istanza poteva "contenere" tutte le caratteristiche della
seconda. Il viceversa era invece "più rischioso", dato che la classe
figlia di norma ha più caratteristiche rispetto a quella da cui eredita.
Ora a me tocca far "passare" un'istanza di una classe (Bambino), ad
un'istanza di una "classe fratello", parlo cioè di due classi dello
stesso livello gerarchico.
Come si progetta un software che deve fare questa cosa?
Si tenga presente che il mio è un discorso generale, e che Bambino e
Adulto sono solo esempi: io vorrei poter far "diventare" un oggetto di
una classe, istanza di un'altra classe che è sullo stesso livello
gerarchico della prima.
Posso solo operare sull'operatore di assegnazione?
O ci sono altre tecniche per gestire questo "passaggio"?
E durante l'esecuzione del programma, come lo gestisco?
Bambino Gesu = Bambino('SonOfGod');
	...
while (Gesu.isAscendedBodilyIntoHeaven()) {
	Gesu.growUp(20);
	Gesu.Manifest('MakeLoveNotPeace!');
	if (Gesu.getAge() > 18) {
		// Qui cosa ci metto?
	}
	Gesu.growUp(33);
	Gesu.makeAMiracle('MultiplyBreadAndFishes');
	Gesu.Eat('BreadAndFishes');
	Gesu.beBetrayed('Giuda');
	Gesu.resurrectAfterADelay('3', 'days');
	Gesu.Ascend();
}
growUp() è un metodo che fa aumentare l'età del Bambino, fino all'età
specificata.
Una volta che ha raggiunto le condizioni per diventare un Adulto, il mio
Bambin(ell)o, entra nel ciclo if e ... come lo faccio diventare un
Adulto?
Come faccio, cioè, a far sì che le ultime istruzioni del while siano
correttamente eseguite, anche dopo essere entrati in quel ciclo if?
Inoltre, dell'oggetto Bambino che ormai non mi serve più, come faccio a
liberarmene in memoria?
Grazie mille e scusate la banalità delle domande.
Spero che scrivendo questo programma riesca a farmi entrare in testa
queste dinamiche un po' più complesse dell'OOP. :-)
Grazie mille.
Giovanni
ps. scusate il subject ;-)

 	Gesu.Manifest('MakeLoveNotPeace!');
NotWar!
Scusate :))
Giovanni
ps. accidenti che lapsus! :o)

 anche dopo essere entrati in quel ciclo if?
Ma allora e' un vizio =)... "if" e' un costrutto di selezione, non fa 
nessun ciclo!
 > Ricordo che c'erano due termini tecnici per indicare l'assegnazione di
 > un'istanza di una classe ad un'istanza di una classe che eredita da
 > essa, e viceversa.
Credo tu ti riferisca ad upcast e downcast. La prima (da una sottoclasse 
ad una superclasse) e' automatica, per la seconda ti serve un cast 
(dynamic_cast o, in rarissimi casi, static_cast). Ma le puoi usare solo 
se le classi sono effettivamente quello in cui vuoi trasformarle.
Ad esempio:
Bambino *b = new Bambino();
Persona *p = b; // upcast a Persona,
	// ma l'oggetto puntato e' di tipo Bambino
Bambino *b2 = dynamic_cast<Bambino *>(p); // risultato b2 == b
	// Ok perche' p punta ad un oggetto di tipo bambino
Adulto *a = dynamic_cast<Adulto *>(p); // risultato a == 0
	// p non punta ad un oggetto di tipo Adulto
 > Ora a me tocca far "passare" un'istanza di una classe (Bambino),
 > ad un'istanza di una "classe fratello", parlo cioč di due classi dello
 > stesso livello gerarchico.
In quest'ipotesi non esiste modo per trasformare un Bambino in un 
Adulto, se non ricreando un nuovo oggetto, copiandovi il contenuto di 
Bambino ed eliminando il vecchio oggetto di tipo Bambino.
--
Marco

 l'istanza Bambino diventa Adulto.
Hai valutato la possibilità che Bambino/Adulto sia invece una proprietà della 
classe a cui l'istanza appartiene?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 Bambino ed eliminando il vecchio oggetto di tipo Bambino.
Vorrei anche farlo, ma poi posso usare lo stesso nome (nell'esempio,
"Gesu") affinché, dopo il *costrutto* if :), le istruzioni siano
eseguite senza errori?
Hum, ora che ci penso, forse mi basta rendere Gesu un puntatore...
chissà però se poi la Chiesa non mi scomunica! ;-)
Grazie ad entrambi.
Giovanni