Le problème est d'appeler une fonction non-const
test2.test()
sur un objet const
test2
depuis testing::test1
.
testing::test1
reçoit test2
en tant que paramètre const testing &test2
. Ainsi, à l'intérieur de testing::test1
, test2const
. Ensuite, dans la première ligne de la fonction :
test2.test()
La fonction testing::test
est appelée sur test2
. Cette fonction n'est pas déclarée avec const
à la fin de la signature, donc elle peut modifier l'objet sur lequel elle est appelée (le pointeur this
implicitement passé), et même si ce n'est pas le cas, le compilateur le suppose. En vous laissant l'appeler là, le compilateur permettrait que vous modifiez une variable const
sans conversion explicite, ce que C++ ne devrait pas autoriser. Par conséquent, pour expliquer le message d'erreur :
test.cpp:15: erreur: le passage de 'const testing' en tant qu'argument 'this' de 'int testing::test()' supprime les qualificateurs
this
fait référence à l'objet sur lequel la fonction membre (testing::test
) opère, et dans ce cas, il n'est pas const
, car testing::test
n'a pas été déclaré avec const
, et donc le conflit est détecté lors de la tentative de faire pointer un pointeur non-const
(this
) vers un objet const
(testing
), en ignorant le const
qualifier.
Pour résoudre cela, décidez si la fonction testing::test
doit jamais avoir besoin de modifier l'objet sur lequel elle est appelée (tel qu'elle est écrite actuellement, elle ne le fait pas, car tout ce qu'elle fait est return 1
, cependant cela peut changer, donc vous devez réfléchir à quelle est sa fonctionnalité prévue). Si elle doit le faire, alors évidemment l'appeler sur un objet const
est mauvais, bien que vous puissiez utiliser const_cast
pour demander au compilateur de passer outre, mais c'est dangereux. Si elle ne doit pas le faire, alors marquez-la const
, pour qu'elle puisse être appelée sur des objets const
également :
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}