Newsgroup: it.comp.lang.c++
Titolo: Una sintassi strana

Qualcuno mi darebbe delle delucidazioni su questa sintassi di assegnazione?
m_ellipsoid.Extent(0) = m_ellipsoidSemiaxis[0];
m_ellipsoid.Extent(1) = m_ellipsoidSemiaxis[1];
m_ellipsoid.Extent(2) = m_ellipsoidSemiaxis[2];
dove
m_ellipsoid č un instanza di una classe definita cosě:
template <class Real>
class WML_ITEM EllipsoidStandard3
{
public:
     // (x/a)^2 + (y/b)^2 + (z/c)^2 = 1
     EllipsoidStandard3 ();
     Real& Extent (int i);
     const Real& Extent (int i) const;
     Real* Extents ();
     const Real* Extents () const;
protected:
     Real m_afExtent[3];
};
La cosa che non mi spiego č l'assegnazione con una funzione.
Il compilatore la compila quindi ha senso, ma non l'ho mai incontrata 
prima e non me la spigo molto...
Grazie,
analisifunzionale (alias matteo!)

 prima e non me la spigo molto...
Il termine lvalue dell'espressione in questo caso non è una funzione, è
quello che la funzione restituisce. Il metodo Extent() restituisce il
riferimento ad un oggetto, quindi tramite l'assegnamento tu vai a modificare
quell'oggetto. E' come se tu scrivessi:
Real &oggetto = m_ellipsoid.Extent(0);
oggetto = m_ellipsoidSemiaxis[0];
Ciao,
  Marco

 quello che la funzione restituisce. 
Vero! Hai ragione, adesso ha tutto senso e mi sembra anche un modo 
elegante di fare funzioni di get/set ma... è efficente?
E' più efficente fare una funzione set apposita o usare un sistema di 
questo tipo?
matteo!

 questo tipo?
La scelta dell'uno o dell'altro metodo per implementare l'accesso agli
oggetti contenuti dipende dal progetto, cioè da come erano state pensate le
rispettive classi. Con il metodo set apposito viene considerato l'oggetto da
modificare come "atomico", cioè puoi solo sostituire quello esistente con
uno nuovo. Con la funzione get non-const invece puoi compiere qualsiasi
operazione di aggiornamento parziale sull'oggetto. Questa seconda scelta
potrebbe essere più rischiosa in quanto non consente di tenere traccia delle
modifiche, ma non è detto che questo interessi alla classe "contenitrice".
Parlando di efficienza, si può dire che questa dipende da due fattori:
1) dimensioni dell'oggetto e "pesantezza" della sua inizializzazione e copia
2) utilizzo che si andrà a fare dell'oggetto
Il get non-const potrebbe essere più efficiente del set SE:
- l'oggetto è grande e/o la sua operazione di creazione/copia/assegnamento è
costosa (ad esempio, se acquisisce e rilascia risorse di sistema);
- l'oggetto è pensato per restare lo stesso durante il ciclo di vita del suo
"contenitore" e su di esso vengono eseguite poche operazioni di
aggiornamento alla volta.
In ogni caso, ripeto, l'efficienza si dovrebbe considerare solo *dopo* le
esigenze di progetto, e dal progetto si dovrebbe riuscire a determinare il
tipo di associazione e quindi il metodo per l'accesso. Prendi ad esempio il
caso di tre classi: Motocicletta, Motore e PastigliaFreno. E' evidente che
la Motocicletta possiederà un Motore e diverse istanze di PastigliaFreno.
Come implementeresti i metodi di accesso a questi due oggetti interni?
1) Motore: trovo difficile che si sostituisca il motore frequentemente,
invece non sarà raro dover eseguire piccoli aggiustamenti o regolazioni.
Probabilmente questo oggetto andrà implementato con un accesso di tipo get
non-const in quanto il suo tempo di vita corrisponde con molta probabilità a
quello della Motocicletta, ma bisognerà poter eseguire singole operazioni su
di esso.
2) PastigliaFreno: sarà invece necessario cambiare le pastiglie dei freni
molto più spesso del motore, mentre raramente si dovranno compiere
operazioni su di esse. In questo caso io implementerei l'accesso come metodo
set, perché le pastiglie sono considerate oggetti atomici rimpiazzabili e
con un ciclo di vita molto più breve.
Sicuramente qualcun'altro potrà darti delle informazioni più formali.
Ciao,
  Marco

 Sicuramente qualcun'altro potrŕ darti delle informazioni piů formali.
Grazie mille: le tue delucidazioni sono state efficacissime. Per le 
informazioni piů formali, adesso che ho capito la questione, so dove 
cercarle.
Grazie,
analisifunzionale!