Newsgroup: it.comp.java
Titolo: Da C++ a Java

Vi pongo un problema: ho un programma C++ che vorrei (o meglio dovrei)
tradurre in Java, ma non ci riesco perche non ho ben chiari alcuni
meccanismi. Il programma è il seguente:
class C
{ public:
    int primo, secondo;
};
C& F(C in, int& ris)
{ C* out = new C();  out->primo = in.secondo;  out->secondo = in.primo;
  if (in.primo == in.secondo) ris = 0;
  else if (in.primo > in.secondo) ris = 1;
  else ris = 2;
  return *out;
}
Come faccio 
p.es
 a tradurre in.primo, oppure a restituire il riferimento
*out!
Vi ringrazio anticipatamente per una vostra risposta.

: 

L'unica cosa da tener presente e' che per gli oggetti in Java hai solo
puntatori, ma senza averne l'aritmetica (percio' si chiamano
"riferimenti"). Quello che non hai sono oggetti locali, allocati sullo
stack. La chiamata di funzione passa appunto questi riferimenti
(copiandoli). Quindi, in Java, "C* c" o "C& c" si traducono con un
semplice "C c". 
I tipi primitivi sono sempre passati per valore, quindi non hai
l'equivalente di "int *" - devi usare un oggetto che incapsuli un intero,
se del caso. In generale, se accettabile, e' meglio modificare la
funzione in modo che *non* faccia cose come la tua (che portano in genere
a side effects poco leggibili e implementazione poco chiara e
manutenibile). 
Ad esempio, nella tua funzione C++, "in" e' passato per copia, ma in
effetti viene usato solo in lettura - quindi puoi traslare usando un
riferimento. Se invece "in" fosse usato in scrittura, le cose sarebbero
piu' complicate. 
Supponendo che tu sia costretto a tradurre la tua funzione pari pari, hai
quindi: 
class C { ..banale.. }
class _int { public int value; }
C F(C in, _int ris)
{ C out = new C();  out.primo = in.secondo;  out.secondo = in.primo;
  if (in.primo == in.secondo) ris.value = 0;
  else if (in.primo > in.secondo) ris.value = 1;
  else ris.value = 2;
  return out;
}
con codice chiamante
...
C in = ...
_int ris = new _int();
C c = F(in, ris);
...
Per una comparazione piu' generica (riferita a Java 1.0), puoi dare
un'occhiata a
http://space.tin.it/computer/csadun/articoli/cpp2java/cpp2java1.html
 
o in generale da
http://space.tin.it/computer/csadun/articoli/
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun

Ingegneria Informatica anno II (La Sapienza)
prof. Cadoli-Lenzerini
Appello del 2 Giugno 2000
...
Hey, ma è quello che ho fatto io!
Ci sono tante maniere per convertire quel codice da C++ a Java.
Io feci questa e andò bene:
class C {
  public int primo;
  public int secondo;
}
class C2 {
  public C c;
  public int i;
}
class Esame {
  public static C2 F(C in) {
    C2 c2 = new C2();
    C out = new C();
    out.primo = in.secondo;
    out.secondo = in.primo;
    c2.c = out;
    if (in.primo==in.secondo) c2.i = 0;
    else if (in.primo>in.secondo) c2.i = 1;
    else c2.i = 2;
    return c2;
  }
}
oppure si può fare in maniera che sia l'intero ad essere restituito e
l'oggetto passato alla funzione, purché l'oggetto di classe C non sia null:
public static int F(C in,C out) {
   out.primo = in.secondo;
   out.secondo = in.primo;
   if (in.primo==in.secondo) return 0;
   else if (in.primo>in.secondo) return 1;
   else return 2;
}
Questo significa che il cliente dovrà fare:
C c1 = new C();
c1.primo = 20;
c1.secondo = 30;
C c2 = new C();
Esame.F(c1,c2);