Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Qt Verifica di due strutture
Forum - C/C++ - Qt Verifica di due strutture

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2301
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 14:32
Domenica, 25/11/2018
Salve ragazzi, Mi sto ancora dilettando con il mio progetto Mappy
( http://www.pierotofy.it/pages/sorgenti/dettagli/19563-Mappy/ )

Ho un problema quando devo eseguire un confronto tra due strutture.
E credo che anche stavolta, mi confondo tra C# e Cpp.

dunque il codice è il seguente

Codice sorgente - presumibilmente C/C++

  1. qDebug() << m.Tiles.count();
  2.  
  3.  
  4.  
  5.     for(int i = 0; i <m.Tiles.count(); i++)
  6.     {
  7.  
  8.        MappySaver::Tile t = static_cast<MappySaver::Tile>(m.Tiles[i]);
  9.  
  10.         int duplicates = 0;
  11.         for(int j = 0; j < m.Tiles.count(); j++)
  12.         {
  13.            if(m.Tiles[i] == m.Tiles[j])  //Errore qui
  14.                duplicates++;
  15.         }
  16.  
  17.         if(duplicates > 1)
  18.             m.Tiles.removeAt(i);
  19.     }




error: no match for 'operator==' (operand types are 'MappySaver::Tile' and 'MappySaver::Tile')
           if(m.Tiles == m.Tiles[j])
                          ^

Non è che forse devo fare un override dell'operatore per verificare l'integrità?
In C# bastava fare un semplice == per verificare una struttura se combacia con l'altra.



Di seguito ho provato a fare in questo modo

Codice sorgente - presumibilmente C++

  1. //Classe MappySaver.h
  2. bool& operator == (MappySaver::Tile &tile, MappySaver::Tile match);
  3.  
  4.  
  5. //MappySaver cpp
  6.  
  7. bool &operator == (MappySaver::Tile &tile, MappySaver::Tile &match)
  8. {
  9.  
  10.     if(tile.ID == match.ID)  //Test solo per questo campo
  11.     {
  12.         return true;
  13.     }else
  14.     {
  15.         return false;
  16.     }
  17. }




Ma mi da errore su entrambi i valori di ritorno

mappysaver.cpp:53: error: invalid initialization of non-const reference of type 'bool&' from an rvalue of type 'bool'
         return true;
                ^

Ho provato anche a mettere sia ad un parametro che ad entrambi l'opzione const ma niente
perché leggendo  non-const credevo che uno tipo di parametro doveva essere const ma niente.

Cosa sbaglio?


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 19:03
Domenica, 25/11/2018
Sbagli il tipo di ritorno: deve essere bool, non bool& e nemmeno cont bool&.

La motivazione è che il booleano che ritorni per riferimento esiste solo all'interno della funzione e non puo essere ritornato or riferimento perché equivale a un "dangling pointer"

Inoltre operator== dovrebbe agire su due riferimenti costanti e far parte della struttura:

bool operator==(const struttura& cmp) const;

Ultima modifica effettuata da TheDarkJuster il 25/11/2018 alle 19:06
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2301
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:38
Lunedì, 26/11/2018
Grazie darkjuster.
Ho cambiato bool&  in bool e aggiunto i parametri come costanti e funziona tutto benissimo.

ed ho modificato anche la funzione in questo modo

Codice sorgente - presumibilmente C++

  1. bool operator == (const MappySaver::Tile &tile, const MappySaver::Tile &match)
  2. {
  3.  
  4.     return (tile.ID == match.ID) && (tile.h == match.h) && (tile.rect == match.rect) && (tile.w == match.w) &&
  5.            (tile.x == match.x) && (tile.y == match.y);
  6. }



Dovrebbe essere corretto perché non riscontro più errori.

Ultima modifica effettuata da Thejuster il 26/11/2018 alle 8:41


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:49
Martedì, 27/11/2018
Testo quotato

Postato originariamente da Thejuster:
Grazie darkjuster.
Ho cambiato bool&  in bool e aggiunto i parametri come costanti e funziona tutto benissimo.

ed ho modificato anche la funzione in questo modo

Codice sorgente - presumibilmente C++

  1. bool operator == (const MappySaver::Tile &tile, const MappySaver::Tile &match)
  2. {
  3.  
  4.     return (tile.ID == match.ID) && (tile.h == match.h) && (tile.rect == match.rect) && (tile.w == match.w) &&
  5.            (tile.x == match.x) && (tile.y == match.y);
  6. }



Dovrebbe essere corretto perché non riscontro più errori.



Hai definito l'operatore di uguaglianza fuori dalla classe di interesse, hai una buona ragione per averlo fatto?

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2301
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 21:09
Sabato, 01/12/2018
No è definito nella classe in cui deve agire l'operatore di uguaglianza.


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote