Il problema sta chiamando un non const
funzione test2.test()
su un oggetto test2
const
da testing::test1
.
testing::test1
ottiene test2
come parametro const testing &test2
. Quindi entro testing::test1
, test2const
. Poi, nella prima riga della funzione:
test2.test()
La funzione testing::test
è chiamato test2
. Tale funzione non è dichiarata con const
alla fine della firma, quindi può modificare l'oggetto su cui è chiamato (il puntatore this
è passato implicitamente ad esso) e anche se non lo fa, il compilatore lo assume. Lasciando che tu lo chiami lì, il compilatore ti permetterebbe di modificare una variabile const
senza un cast esplicito, che C++ non dovrebbe permettere. Quindi per spiegare il messaggio di errore:
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
this
riferisce all'oggetto la funzione membro (testing::test
) opera su, e in questo caso non è const
, perché testing::test
non è stato dichiarato con const
, e quindi la disallineamento viene rilevata quando si cerca di fare un const
puntatore non (this
) si riferiscono a un oggetto const
(testing
), ignorando la const
qualificazione.
per risolvere questo, decidere se la funzione testing::test
dovrebbe mai bisogno di modificare l'oggetto è chiamato (il modo in cui è scritto ora non, come tutto ciò che fa è return 1
, tuttavia, che può cambiare, così è necessario pensare a quale sia la sua funzionalità prevista). Se è così, è ovvio che chiamare su un oggetto const
non sia corretto, sebbene sia possibile utilizzare const_cast
per chiedere al compilatore di sovrascriverlo, ma ciò è pericoloso. Se non dovrebbe, poi segnarlo const
, in modo che possa essere chiamato const
oggetti così:
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}
fonte
2009-02-15 06:45:27