El problema está llamando a una función no const
test2.test()
en un objeto test2
const
de testing::test1
.
testing::test1
obtiene test2
como parámetro const testing &test2
. Entonces dentro de testing::test1
, test2const
. Luego, en la primera línea de la función:
test2.test()
La función se llama testing::test
en test2
. Esa función no se declara con const
en el extremo de la firma, por lo que puede modificar el objeto al que se llama (el puntero this
se le pasó implícitamente), y aunque no lo hace, el compilador asume que sí. Al permitir que lo invoque allí, el compilador le permite modificar una variable const
sin un molde explícito, que C++ no debe permitir. Por lo tanto, para explicar el mensaje de error:
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
this
se refiere al objeto de la función miembro (testing::test
) opera en, y en este caso no es const
, porque testing::test
no fue declarado con const
, y por lo tanto la desajuste se detecta cuando se trata de hacer una const
puntero no (this
) se refieren a un objeto const
(testing
), ignorando el calificador const
.
para resolver este, decidir si la función testing::test
debe necesitar modificar el objeto al que se llama en (la forma en que se escribe ahora no, ya que lo único que hace es return 1
, sin embargo, que puede cambiar, por lo necesitas pensar en cuál es su funcionalidad prevista). Si es así, obviamente llamarlo a un objeto const
es malo, aunque puede usar const_cast
para solicitar al compilador que lo anule, pero esto es peligroso. Si no debe, a continuación, marcarlo const
, por lo que se puede llamar en const
objetos así:
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}