Newsgroup: it.comp.lang.c++
Titolo: una domanda strana sugli operatori

Sentite questo quesito.
se io creo una classe, posso creare per lei l'operatore ! (not) scrivendo
operator !()  ......
cosě poi, se ho un oggetto A di quella classe posso fare un'istruzione del
tipo:
if (!A) ....
ma se io volessi fare
if (A) .....
come dovrei fare???? Non esiste nessun operatore di cui fare l'overload!
Mi sembra strano che sia previsto il 1° caso e non questo che č piů
semplice!
Ciao
Michele Alessandrini
-- 
Posted from 
relay4.inwind.it
 [212.141.53.75] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 semplice!
...carina questa...
Ma un'istruzione del genere, il compilatore la traduce in (A != 0) e quindi
in (! (A == 0)) ?
In tal caso, basterebbe ridefinire l'operator == per gestire l'uguaglianza a
zero, qualunque cosa questo voglia dire per la tua classe...
Massimo

 semplice!
Io ridefinirei l'operatore di cast a bool della classe di cui A e'
un'istanza.
(untested)
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

 come dovrei fare???? Non esiste nessun operatore di cui fare l'overload!
Si che esiste. 'if' testa una condizione booleana (bool), quindi basta
definire per la tua classe "operator bool()".
Ciao
Domenico Barra

zero, qualunque cosa questo voglia dire per la tua classe...
No. 
Come dice Maurizio Loreti il codice:
if ( a ) 
cerca di convertire a in un bool. Pertanto basta definire il relativo
operatore.
ovvero:
class A {
public:
	operator bool() const 
	{ 
		bool ret;
		/* calcola il valore da ritornare */ 
		return ret;
	}
};
Ovviamente fatto questo e' probabile che operator! non serva piu'.
A meno che la classe A non sia un "booleano speciale" o a meno che
operator! non abbia un significato diverso da quello ordinario (nel
qual caso pero' probabilmente non ritornerebbe un bool ma qualche 
altra cosa).
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556
 
-- 
Posted from 
adsl-21-135.38-151.net24.it
 [151.38.135.21] 


zero, qualunque cosa questo voglia dire per la tua classe...
Questo e vero a patto che operator== restituisca (come ci si aspetti)
un balore booleano o comunque ad esso riconducibile.
Paolo
--
Paolo Marotta
Duck Communication Entertainment s.r.l.
Largo Arenula, 11 - Roma
http://www.duckce.com
p.ma...@duckce.com
-- 
Posted from 
HA-server-a.cs.interbusiness.it
 [151.99.250.31] 


come dovrei fare???? Non esiste nessun operatore di cui fare l'overload!
Una possibilita` e` definire l'operatore di conversione "operator bool()".


altra cosa).
Lo so che sono malato, ma confesso che a questo punto mi sono chiesto cosa
accadrebbe ridefinendoli entrambi, operator ! e operator bool...
Massimo


Basta un po' di logica. In questo caso, qualora tu scrivessi "if(!a)" il
compilatore richiamerebbe l'operatore !. Nel caso non vi fosse alcun
operatore !, ovvero se tu scrivessi "if(a)", il compilatore effettuerebbe la
conversione a bool. Nel caso tu scrivessi "if(a==0)" il compilatore
cercherebbe l'operatore ==, e segnalerebbe errore se tale operatore non
fosse definito... e cosi' via.
Ciao
Domenico Barra

 fosse definito... e cosi' via.
Beh, essendo definito operator bool() penso che risolverebbe ( a == 0 )
con l'operatore built in.
Ciao,
Nicola

accadrebbe ridefinendoli entrambi, operator ! e operator bool...
La regola (piu` o meno implicita) e` quella di applicare sempre l'operatore
piu` specifico, in particolare se scrivi !Obj il compilatore cerca di applicare
prima l'operatore di negazione (!), se non lo trova prova a cercare una 
conversione
a bool o ad altro tipo per cui sia definito operator!
Paolo


Grazie a tutti!


Lo credo anch'io. Intendevo nel caso non fosse definito alcun operatore
specifico per la classe in questione.
Ciao
Domenico

con l'operatore built in.
Quale operatore built-in?
Se a e' di classe A ed e' definito solo "A::operator bool()" oppure 
"A::operator bool() const" allora puoi scrivere "if ( a )" che si
risolve a 
chiamare "A::operator bool()". Puoi anche scrivere "if ( !a )" che si
risolve
a chiamare "A::operator bool()" e poi a passare il risultato a 
"bool operartor!(bool)" (o potrebbe anche essere "bool
bool::operator!()") 
che e' predefinita.
Se invece scrivi "if(a==0)" verranno cercate "T1 A::operator==(T2)"
oppure 
"T1 A::operator==(T2) const" oppure "T1 operator==(TA,T2)" dove T1 puo'
essere
qualunque cosa (che verra' poi convertita a bool), T2 e' un tipo per il
quale 
esiste un cast da int (puo' essere int, int&, const int& etc oppure
long, unsigned
etc. oppure una classe con un costruttore che prende un int.) mentre TA
e' un tipo
base di A (puo' essere A, const A, const A& o le varianti in cui al
posto di a c'e'
una classe da cui A deriva). Nessuno di questi operatori e' predefinito.
Nel caso in cui oltre a "A::operator bool()" oppure "T1
A::operator==(T2) const" 
sia anche definito "T A::operator!()" oppure "T A::operator!() const"
oppure 
"T operator!(A)" oppure "T operator!(A&)" oppure "T operator!(const
A&)", quando
scrivi "if(!a)" verra' chiamato quest'ultimo operatore. Il valore di
ritorno (che
e' di tipo T e potrebbe non esere un bool) verra' poi convertito in un
booleano
dato che siamo un un contesto di "if".
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556
 
-- 
Posted from 
adsl-21-135.38-151.net24.it
 [151.38.135.21] 


 una classe da cui A deriva). Nessuno di questi operatori e' predefinito.
TA puo' essere qualsiasi tipo per il quale esista una sequenza di
conversioni da A che comprenda una sola conversione definita
dall'utente, nel caso specifico
da A a bool tramite A::operator bool() e da bool a int predefinita.
Ciao,
Nicola

 da A a bool tramite A::operator bool() e da bool a int predefinita.
Giusto. Mi era sfuggita!
--
