Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] operatori equals e instanceof: esistono? Alternative?

    Salve gente,

    come molti avranno intuito dal titolo, sto piano piano passando da Java a C++, e volendo realizzare un piccolo software che ho fatto in Java, anche in C++, mi trovo di fronte ad alcuni problemini.

    Per prima cosa vorrei capire bene come verificare se due oggetti sono uguali. In Java esiste l'operatore equals, che può essere ridefinito, ad esempio come segue:

    codice:
    public boolean equals(Object o) {
    	if (o == null)
    	return false;
    	if (!(o instanceof ClasseDellOggetto))
    	return false;
    	ClasseDellOggetto o1 = (ClasseDellOggetto) o;
    	return this.campo1==o1.campo1 && this.campo2==o1.campo2;
    }
    Ovviamente la classe ClasseDellOggetto, presa in esempio, qui ha due attributi.

    Vorrei sapere se c'è un metodo "standard" in C++ per fare la stessa cosa. Ho letto qua e la, che basterebbe verificare se tutti gli attributi di un oggetto sono uguali a quelli di un altro per verificare se sono uguali: è corretto? O c'è dell'altro?

    Dal problema dell'equals, scaturisce il problema istanceof: esiste l'analogo in C++?
    Come si fa a vedere se un certo oggetto è istanza di una certa classe?

    EDIT:
    per il momento mi sono limitato a definire una funzione del genere per vedere se due oggetti sono uguali (ovvero se i loro attributi sono uguali):
    codice:
    bool MyClass::equals(MyClass *p){
    	if(p==NULL)
    		return false;
    	return (this->attr1==p->attr1 &&
    			this->attr2==p->attr2);
    }
    Pare che funzioni, spero sia corretto come ho fatto.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per il primo caso puoi usare operator==(), ma funziona solo con oggetti non con puntatori a oggetti (in questo caso viene confrontato l'indirizzo).
    codice:
    class Qualcosa {
       public:
          bool operator==(const Qualcosa& q) {
             return dt == q.dt;
          }
       private:
          int dt;
    };
    
    Qualcosa a,b;
    if (a == b) { azione; }
    Per il secondo puoi vedere typeinfo
    http://www.cplusplus.com/reference/s...nfo/type_info/
    la cui implementazine però dipende dal compilatore.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Molte grazie, quindi basta ridefinire l'operatore == in pratica.

  4. #4
    Originariamente inviato da shodan
    codice:
    Qualcosa a,b;
    if (a == b) { azione; }
    Una domanda: ho provato a fare l'override dell'operatore ==. Perché se provo a farlo su due puntatori a oggetto (o meglio con due oggetti creati con la "new") non funziona? Mi restituisce sempre "diversi".

    codice:
    Oggetto *o1 = new Oggetto("ciao");
    Oggetto *o2 = new Oggetto("ciao");
    
    if(o1 == o2){
    	cout << "Uguali" << endl;
    }else{
    	cout << "Diversi" << endl;
    }
    O meglio: c'è un altro modo per farlo?
    Posso immaginare che o1 e o2 puntano a indirizzi di memoria diversi, quindi l'uguale mi dovrebbe dare sempre un valore falso, ma pensavo che ridefinendo quell'operatore la cosa funzionasse lo stesso.

    La funzione che ho scritto è di questo tipo:

    codice:
    bool Oggetto::operator==(const Oggetto& o){
    	return (this->arg1==o.arg1 &&
    		this->arg2==o.arg2);
    }

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Overload. L'override lo hai solo col polimorfismo.
    funziona solo con oggetti, non con puntatori a oggetti (in questo caso viene confrontato l'indirizzo).
    Nella pratica si definisce una funzione come hai fatto tu e si usa l'operatore==() per richiamarla.
    In questo caso si definisce l'operatore inline (o nel corpo della classe) in modo che il compilatore possa ottimizzare la chiamata.
    In due parole: zucchero sintattico.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Perdonami, l'avevo anche letto che funzionava solo con oggetti. La fretta mi ha fatto confondere.
    Nella pratica si definisce una funzione come hai fatto tu e si usa l'operatore==() per richiamarla.
    Quindi sostanzialmente dovrei fare una cosa del genere?

    codice:
    inline bool MyClass::operator==(const MyClass *p){
    	if(p==NULL)
    		return false;
    	return (this->attr1==p->attr1 &&
    			this->attr2==p->attr2);
    }

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quasi.
    codice:
    class Qualcosa {
       public:
          bool operator==(const Qualcosa& q) {
             return this->equals(q);
          }
    
       bool equals(const Qualcosa& q) {
          return this->equals(&q);
       }
    
       bool equals(const Qualcosa* q) {
          return dt == q->dt;
       }
    
       private:
          int dt;
    };
    
    Qualcosa a,b;
    Qualcosa *pa, *pb;
    
    pa = &a;
    pb = &b;
    
    if (a == b) { azione; } // corretto (*)
    
    if ( (*pa) == b ) { ... } // corretto;
    
    if ( (*pa) == (*pb) ) { ... } // corretto;
    
    if ( pa->equals(*pb) ) { ... } // corretto; 
    
    if ( a.equals(b) ) { ... } // corretto
    Se metti in overload equals() per far accettare un puntatore, supporti in pratica tutte le sintassi possibili.

    codice:
    if (pa->equals(pb)) ...
    if (pa->equals(b)) ...
    etc.
    (*) questa è la sintassi naturale, obbligatoria per lavorare con gli algoritmi standard.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Grazie infinite!!!


  9. #9

    Re: [C++] operatori equals e instanceof: esistono? Alternative?

    Originariamente inviato da fbcyborg
    codice:
    public boolean equals(Object o) {
    	if (o == null)
    	return false;
    	if (!(o instanceof ClasseDellOggetto))
    	return false;
    	ClasseDellOggetto o1 = (ClasseDellOggetto) o;
    	return this.campo1==o1.campo1 && this.campo2==o1.campo2;
    }
    stai cercando di scrivere codice "offuscato"? Ti rendi conto che l'identificatore "o" è poco leggibile?
    http://en.wikipedia.org/wiki/Obfuscated_code

    identificatore NON offuscato (autodocumentante):
    applicationShouldTerminateAfterLastWindowClosed

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.