Newsgroup: it.comp.java
Titolo: Passaggio per riferimento rispetto al C++

Salve a tutti, ho il seguente problema.
Tanti anni fa mi è stato insegnato che in C++ non è il caso, per ovvi motivi 
di efficienza, di definire metodi come:
MyType Collezione::GetObj(int index);         // ritorna l'index-esimo 
oggetto di Collezione
in cui il tipo MyType sia "pesante". Piuttosto si preferisce:
void Collezione::GetObj(MyType *dest, int index);
dove l'oggetto da "riempire" è passato dalla funzione chiamante, mentre la 
GetObj non ne crea nè ritorna alcuno. Poichè Java non ha puntatori, e poichè 
non conosco i meccanismi interni di javac, mi chiedevo se esista un 
corrispettivo di questo problema in Java, o se per caso le cose cambino.
Cioè in Java la prima versione crea gli stessi problemi di efficienza che si 
vengono a creare nel C++? Se sì, come si realizza il corrispettivo della 
seconda?
Grazie,
--
Francesco. 

> GetObj non ne crea nè ritorna alcuno. Poichè Java non ha puntatori, e
poichè
   Falso, falsissimo. Dove l'hai letta 'sta cosa?

    Falso, falsissimo. Dove l'hai letta 'sta cosa?
E' una vecchia č (imho inutile) diatriba.
In java ci sono i riferimenti o reference. Rispetto ai puntatori hanno 
delle similitudini di comportamento, ma anche delle differenze 
estremamente sostanziali. Nei testi piů rigorosi il termine "reference" 
non č mai accostato al termine "pointer".

 seconda?
Piccolo appunto OT: il secondo approccio che hai descritto sarebbe 
peraltro errato, dovresti passare il puntatore per reference (in C++) 
oppure un puntatore a puntatore.

 ha scritto nel messaggio 
news:d77lde$lgh$1...@area.cu.mi.it...

Oh finalmente!
Comunque per riprendere la domanda iniziale il passaggio dei parametri 
equivale quanto a efficienza a un passaggio by value dell'oggetto c++. Per 
lo stesso motivo del c++ tuttavia l'oggetto puň tornare modificato nel suo 
stato interno se la funzione ne modifica lo stato appunto.
Un comportamente equivalente dal punto di vista semantico rispetto al 
passaggio by value del c++, che chiama in gioco il costruttore di copia, si 
ha chiamando una funzione che clona l'oggetto:
f(o.clone());
dove clone dovrebbe restituire un *altro* oggetto equivalente a "o". clone 
devi ridefinirlo tu perň. 

 oppure un puntatore a puntatore.
Non mi risulta. Se vuoi fare un passaggio per riferimento passi l'indirizzo 
dell'oggetto da modificare, non l'indirizzo del puntatore all'oggetto da 
modificare.
Grazie per la risposta.
--
Francesco. 

   Falso, falsissimo. Dove l'hai letta 'sta cosa?
Sono sempre piů convinto che non ci sia modo di aprire un thread di 
confronto tra Java e C++ senza che immediatamente partano polemiche 
inutili...
--
Francesco 

 devi ridefinirlo tu però.
Ok, qui è chiaro. Però mi sorge la domanda: all'interno di "clone()" come 
faccio a restituire un "altro" oggetto uguale se facendo return mi viene 
restituito un reference?
Grazie delle risposte.
--
Francesco.

 restituito un reference?
Questo che centra.
E' come fare in C++
Object* MyType::clone()
{
    MyType* c = new MyType();
    c->data = this.data;
    return c;
}
mica é un problema!
Ah per quanto riguarda il metodo clone guardatelo bene se ti serve...in 
teoria puoi anche non dover manualmente copiare i dati dell'oggetto se 
implemnetai un interfaccia Clonable...ma devi cmq.....ecc ecc, insomma 
guardatelo se ti interessa! (c'è un meccanismo particolare dietro). 

 Qualcosa" e poi faccio "return Qualcosa" viene ritornato un reference?
Si.

 [...]
Tutto chiaro, grazie.
--
Francesco. 

Ma quali polemiche inutili e polemiche inutili.
Tu esordisci con un "in java non ci sono puntatori" e ci basi tutta una
diatriba su. Mi sta anche bene, ma se adoper un gocciolino il cervello ti
rendi conto che' i puntatori CI SONO eccome.
Non occorre essere degli esperti mostruosi. Basta "immaginare" un metodo
come
public void FaiQualcosa(Immagine img)
per rendersi conto che o java e' COMPLETAMENTE inutilizzsabile e sbagliato
come linguaggio oppure si passa un PUNTATORE all'oggetto IMG. Perche'
altrimenti, visto che conosci C++ e che in java NON CI SONO costruttori di
copia di default dovresti arrivare a capire che e' impossibile che
nell'ambiente locale venga copiato l'intero oggetto img.
Non e' questione di polemiche inutili... semplicemente e' questione di
domande piu' o meno utili.
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

 nell'ambiente locale venga copiato l'intero oggetto img.
i puntatori potrebbero benissimo non esserci ed esserci invece un 
costruttore di copia di default che fa la copia membro a membro, dal momento 
che si é supposto che i puntatori non esistono non c'è nessun problema nel 
farlo. 

 farlo.
   Non e' possibile, a meno di presumere che chi ha disegnato Java sia un
emerito cretino. Se non ci sono puntatori e c'e' costruttore di copia di
default, il metodo di esempio che ho scritto paralizzerebbe la VM.
   In sostanza, l'assenza di puntatori abbinata a un costruttore di copia di
default che copia membro-membro renderebbe praticamente inutilizzabile il
linguaggio. Ora, visto che Java e' tutto fuorche' inutilizzato basta
fermarsi un attimo, mettere il criceto a correre sulla ruota e la soluzione
e' lampante: puntatore all'oggetto! :-)
Ciao,
   Francesco


Ovvio che sono necessari per un linguaggio ben fatto!
Dicevo solo che non era necessario dall'esempio che hai fatto.
D'altronde in C non esistono i costrutori di copia e invece é permesso 
passare una struct come parametro anche se non è un puntatore a struct. 

 domande piu' o meno utili.
Personalmente mi interessava di più l'utilità delle risposte. E le risposte 
che ho ricevuto, a parte le tue, mi sono state molto utili.
--
Francesco
www.gbawins.com