Oppure

Loading
25/11/18 13:32
Thejuster
Salve ragazzi, Mi sto ancora dilettando con il mio progetto Mappy
( 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


 qDebug() << m.Tiles.count();



    for(int i = 0; i <m.Tiles.count(); i++)
    {

       MappySaver::Tile t = static_cast<MappySaver::Tile>(m.Tiles[i]);

        int duplicates = 0;
        for(int j = 0; j < m.Tiles.count(); j++)
        {
           if(m.Tiles[i] == m.Tiles[j])  //Errore qui
               duplicates++;
        }

        if(duplicates > 1)
            m.Tiles.removeAt(i);
    }





error: no match for 'operator==' (operand types are 'MappySaver::Tile' and 'MappySaver::Tile')
if(m.Tiles[i] == 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


//Classe MappySaver.h
bool& operator == (MappySaver::Tile &tile, MappySaver::Tile match);


//MappySaver cpp

bool &operator == (MappySaver::Tile &tile, MappySaver::Tile &match)
{

    if(tile.ID == match.ID)  //Test solo per questo campo
    {
        return true;
    }else
    {
        return false;
    }
}




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?
mire.forumfree.it/ - Mire Engine
C# UI Designer
25/11/18 18:03
TheDarkJuster
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 25/11/18 18:06
aaa
26/11/18 7:38
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


bool operator == (const MappySaver::Tile &tile, const MappySaver::Tile &match)
{

    return (tile.ID == match.ID) && (tile.h == match.h) && (tile.rect == match.rect) && (tile.w == match.w) &&
           (tile.x == match.x) && (tile.y == match.y);
}



Dovrebbe essere corretto perché non riscontro più errori.
Ultima modifica effettuata da Thejuster 26/11/18 7:41
mire.forumfree.it/ - Mire Engine
C# UI Designer
27/11/18 16:49
TheDarkJuster
Postato originariamente da Thejuster:
Grazie darkjuster.
Ho cambiato bool&amp; in bool e aggiunto i parametri come costanti e funziona tutto benissimo.

ed ho modificato anche la funzione in questo modo


bool operator == (const MappySaver::Tile &amp;tile, const MappySaver::Tile &amp;match)
{

    return (tile.ID == match.ID) &amp;&amp; (tile.h == match.h) &amp;&amp; (tile.rect == match.rect) &amp;&amp; (tile.w == match.w) &amp;&amp;
           (tile.x == match.x) &amp;&amp; (tile.y == match.y);
}


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?
aaa
01/12/18 20:09
Thejuster
No è definito nella classe in cui deve agire l'operatore di uguaglianza.
mire.forumfree.it/ - Mire Engine
C# UI Designer