Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]overload operatore ==

    ciao.
    ho provato a fare un oveerload dell' operatore == di una mia classe cosi:

    class Vertex
    {
    public:
    bool operator ==(Vertex other);
    }


    questo funziona ad es se faccio:

    Vertex v1,v2;
    if(v1==v2).....


    ma non se ho:
    Vertex * v1,v2
    if (v1==v2)....


    come faccio a fare l'overload di == su due instanze della stessa classe?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Non torna il discorso
    V1 è un puntatore, V2 no, dunque non può funzionare.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3

    Re: [c++]overload operatore ==

    Originariamente inviato da giuseppe500

    ma non se ho:
    Vertex * v1,v2
    if (v1==v2)....


    come faccio a fare l'overload di == su due instanze della stessa classe?
    Grazie.
    sostitusci con:
    codice:
    Vertex * v1,v2
    if ((*v1)==v2)....

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.
    Ma non ho capito perchè mcapp,e non c 'è un modo di fare l'overload dell' operatore == tra due instanze della stessa classe.
    poi ,ho scritto male,

    Vertex* v = new Vertex();
    Vertex* v1 = new Vertex();

    if(v1==v2)
    .
    .
    .
    non

    Vertex * v1,v2 e
    if(V1==V2)

  5. #5
    quindi:
    codice:
    if ((*v1)==(*v2))....
    Cosa intendi per:
    fare l'overload dell' operatore == tra due instanze della stessa classe
    ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Sto utilizzando le collezioni dell'mfc.
    In particolare mi è stato consigliato l' std::set.
    Devo inserire un oggetto nella collezione set solo se non è gia' presente un oggetto con gli stessi parametri.
    sto cercando di fare l'overload dell'operatore == di una struttura(che è il tipo della collezione) per stabilire qual ' è il criterio di ugualianza utilizzato dal set.find in modo da rendere uguali due oggetti se hanno 3 parametri uguali:
    Normalx,
    Normaly e
    Normalz,.
    Per questo devo creare un overload cosi':

    bool Vertex:perator==(Vertex* other)
    {
    if(this->_nx == other._nx && this->_ny == other._ny && this->_nz == other._nz)
    return true;
    return false;
    }

    Almeno spero di aver capito bene.
    Ciao

  7. #7
    Dovrebbe essere
    codice:
    bool Vertex::operator==(Vertex& other)
    .
    P.S.: std::set non è un container MFC, ma STL.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    prova così (da notare che ho aggiunto i "const"):
    codice:
    bool Vertex::operator==(const Vertex &other) const{
    	return (this->_nx == other._nx) && (this->_ny == other._ny) && (this->_nz == other._nz);
    }
    p.s: ma perché non usi i tag code?
    p.s2: evita di definire identificatori che iniziano con l'underscore. Tali identificatori sono riservati all'implementazione sia del linguaggio che del compilatore.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ti posto il codice,non riesco a farlo funzionare:
    codice:
    #include "stdafx.h"
    #include <iostream>
    #include <set>
    #include "struct2s.h"
    using namespace std;
    
    int main ()
    {
      set<Vertex*> myset;
     
      // set some initial values:
      Vertex vz,vy;
    
      Vertex* v = new Vertex();
      Vertex* v1 = new Vertex();
    
    
      v->_nx =1;
      v1->_nx =1;
    
      myset.insert(v);
      
      if(*v==*v1)
    	  cout<<" uguale";
      else
    	  cout<<" diverso";
      
      if(myset.find(v1)== myset.end())
    	  cout<<" non presente";
      else
    	  cout<<" gia presente";
      int r;
      cin >> r;
      return 0;
    }
    
    struct Vertex
    {
    	Vertex(){}
    	Vertex(float x, float y, float z, 
    		float nx, float ny, float nz, float u, float v)
    	{
    		 _x = x;   _y = y;   _z = z;
    		_nx = nx; _ny = ny; _nz = nz;
    		 _u = u;   _v = v;
    	}
    
    	float _x, _y, _z, _nx, _ny, _nz, _u, _v;
    	bool operator ==(Vertex& other);
    
    	//static const DWORD FVF;
    };
    
    bool Vertex::operator==(Vertex& other)
    {
    	if(this->_nx == other._nx)
    		return true;
    	return false;
    }
    if(*v==*v1)
    entra nell overload ritorna true ed è giusto , ma..

    if(myset.find(v1)== myset.end())
    cout<<" non presente";
    else
    cout<<" gia presente";
    int r;

    non entra nella funzione di overload,ritorna true e non dovrebbe , mi aspetterei un false in quanto è già presente un oggetto con le stesse caratteristiche:
    v->_nx =1;
    v1->_nx =1;
    myset.insert(v);//inserito

    ciao.

  10. #10
    il contenuto del tuo "set" sono puntatori. Quindi il confronto in set::find viene fatto sul valore numerico del puntatore, non sull'oggetto puntato.
    Devi fornire pertanto al "set" un funtore adatto:

    ad esempio:

    Codice PHP:
    //
    // Compiled and tested with:
    // i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    //
    // Compilation command line (zero errors, zero warnings):
    // $ g++ -Wall -ansi -pedantic main.cpp
    // 

    #include <iostream>
    #include <set>
    using namespace std;

    struct Vertex
    {
        
    Vertex(){}
        
    Vertex(float xfloat yfloat z
            
    float nxfloat nyfloat nzfloat ufloat v)
        {
             
    _x x;   _y y;   _z z;
            
    _nx nx_ny ny_nz nz;
             
    _u u;   _v v;
        }

        
    float _x_y_z_nx_ny_nz_u_v;
        
    bool operator ==(const Vertexother) const;
        
    bool operator < (const Vertexother) const;

        
    //static const DWORD FVF;
    };

    bool Vertex::operator==(const Vertexother) const{
        return 
    this->_nx == other._nx;
    }

    bool Vertex::operator<(const Vertexother) const{
        return 
    this->_nx other._nx;
    }

    namespace 
    ig{
        
    template <typename TClass>
        
    struct SLessPointerFunctor{
            
    bool operator ()(const TClass v1,  const TClass v2) const{
                return *
    v1 < *v2;
            }    
        };
    }

    int main ()
    {
      
    set <Vertex *, ig::SLessPointerFunctor <Vertex> > myset;
     
      
    // set some initial values:
      // Vertex vz,vy;

      
    Vertex= new Vertex();
      
    Vertexv1 = new Vertex();


      
    v->_nx =1;
      
    v1->_nx =1;

      
    myset.insert(v);
      
      if(*
    v==*v1)
          
    cout<<" uguale";
      else
          
    cout<<" diverso";
      
      if(
    myset.find(v1)== myset.end())
          
    cout<<" non presente";
      else
          
    cout<<" gia presente";
      
    int r;
      
    cin >> r;
      return 
    0;

    osserva che le due parentesi acute prima di myset DEVONO essere separate da uno spazio, altrimenti vengono interpretate come operatore di shift.
    Il funtore ig::SLessPointerFunctor come vedi è generico, e probabilmente è già presente nella libreria std in zona std::less, ma non ho voglia di cercarlo ;-)

    EDIT: generalizzando ancor di più:
    Codice PHP:
    #include <functional>
    ...
    namespace 
    ig{
        
    template <typename TBinaryPredicatetypename TClass>
        
    struct SPointerFunctor{
            
    bool operator ()( const TClass v1,  const TClass v2) const{
                
    TBinaryPredicate a;
                return 
    (*v1, *v2);
            }    
        };
    }
    ...
      
    set <Vertex *, ig::SPointerFunctor <less <Vertex>, Vertex> > myset

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 © 2025 vBulletin Solutions, Inc. All rights reserved.