Newsgroup: it.comp.lang.c++
Titolo: Const e Reference

Ciao a tutti!
Ho un problema (sempre col progettino dell'altro giorno).
Ammettiamo di avere una classe per la gestione di numeri a precisione
arbitraria, che ha dei metodi di questo tipo:
...
bool Add(CNumber &n, CNumber &Result);
bool Sub(CNumber &n, CNumber &Result);
bool Mult(CNumber &n, CNumber &Result);
bool Mult(unsigned long n, CNumber &Result);
bool Div(CNumber &n, CNumber &Result, int precision);
...
Ovviamente vorrei poter passare n come valore costante, così da essere
sicuro che il dato non venga cambiato. Il problema però risiede nel fatto
che per compiere le operazioni su numeri reali, bisogna considerare tutti i
casi algebrici in cui i segni dei numeri discordano.
Per fare ciò le funzioni di cui sopra hanno una serie di controlli sui segni
dei numeri (la classe CNumber ha essenzialmente 3 campi: CVString
m_NumberStr; CVString m_MantixStr; char m_Sign; l'ultimo appunto contiene il
segno del numero).
Così facendo se ho ad esempio A + (-B) (dove A è *this e B è n) ovvero se ho
da sommare due numeri uno positivo e l'altro negativo, posso cambiare il
segno a B temporaneamente, eseguire la differenza sui due valori A e B <--
(positivo ora) e successivamente ripristinare il segno - al numero B.
Il problema è che se cambio i prototipi delle varie funzioni in questo modo:
bool Add(const CNumber &n, CNumber &Result);
il compilatore giustamente si arrabbia e mi ferma la compilazione. Come
potrei fare quindi per ovviare a questo problema? Da una parte è comodissimo
il fatto di cambiare temporaneamente segno al numero, dall'altra sarebbe
bello poter avere la certezza che n non venga cambiato dalle funzioni.
Non esiste un metodo per aggirare l'ostacolo, che non sia quello di
inventarsi un prototipo del tipo
bool Add(const CNumber &n, char NuovoSegnoDiN, CNumber &Result);
?
Grazie mille per l'attenzione!
Dome
PS: Alla fine ho creato i copy constr. mancanti, anche se ho scoperto che
non vengono mai chiamati (beh... ho messo tutti reference), ma almeno ho un
possibile problema in meno sul groppone! Grazie!

 wrote in message
news:w4LC9.186$3l....@twister1.libero.it...

aggiungi l'operatore  meno unario
qualcosa come
CNumber operator-(const CNumber &a)
{
        CNumber b(a);
        b.sign= ! b.sign;
        return b;
}

 }
Ahia! A me quell'operatore serve già per altri scopi e credo che se ne
definissi un altro creerei strani casini!
Altre idee?
Grazie comunque per l'aiuto!
Dome

 bool Add(const CNumber &n, char NuovoSegnoDiN, CNumber &Result);
usi mutable per il segno

> usi mutable per il segno
Mutable? Una keyword che non conosco... ora mi documento (anche se penso
proprio di aver intuito a cosa serva)
Se funziona come penso mi hai risolto un problema!
Grazie mille per l'aiuto!
Dome
PS: Ma il fatto che non ho mai sentito questa "parolina" significa qualcosa?
E' brutta stilisticamente? :) Demonizzata come il goto? Sono solo io
ignorante? :P

PS: Ma il fatto che non ho mai sentito questa "parolina" significa qualcosa?
Significa, per esempio, che non hai mai letto un libro di C++ ;)

 }
oppure l'equivalente che sfrutta il passaggio per valore anziche` per 
reference:
CNumber operator-(CNumber a)
{
        a.negate();
        return a
}
In questo caso il copy ctor e` chiamato implicitamente dal compilatore: 
la scelta di quale versione usare e` una pura questione di stile.
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

 usi mutable per il segno
IMHO e` un pessimo consiglio; questo significa che se ho:
CVNumber a = 5;
CVNumber b = 7;
CVNumber c = a - b;
improvvisamente scopro che b vale -7 anziche` 7.


 improvvisamente scopro che b vale -7 anziche` 7.
deriva da quello che ha detto lui: se vuole cambiare solo 
temporaneamente il segno, si deve necessariamente fare una copia di b, 
altrimenti si usa mutable.
Se comunque il segno e' parte della classe, e lo dichiara mutable, puo' 
cambiarlo temporaneamente, ricordandosi poi di risistemarlo