Проблема заключается в вызове не const
функции test2.test()
для const
объекта test2
из testing::test1
.
testing::test1
получает test2
в качестве параметра const testing &test2
. Так в пределах testing::test1
, test2const
. Затем в первой строке функции:
test2.test()
Функция testing::test
вызывается на test2
. Эта функция не объявлена с const
в конце подписи, поэтому она может изменять объект, к которому она вызывается (указатель this
неявно передается ей), и даже если это не так, компилятор предполагает это. Позволяя вам вызывать его там, компилятор позволит вам изменить переменную const
без явного преобразования, которое C ++ не должно допускать. Поэтому объяснить сообщение об ошибке :
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
this
относится к объекту, над которым работает функция-член (testing::test
), и в этом случае это не const
, потому что testing::test
не был объявлен с const
, и, таким образом, обнаружено несоответствие при попытке сделать указатель не const
(this
) ссылается на объект const
(testing
), игнорируя квалификатор const
.
Чтобы решить эту проблему , решите, должна ли когда-либо функция testing::test
изменять объект, к которому она обращена (как это пишется сейчас, она не делает, поскольку все, что она делает, это return 1
Тем не менее, это может измениться, поэтому вам нужно подумать о том, какова его предполагаемая функциональность). Если это так, то, очевидно, вызов его для объекта const
- это плохо, хотя вы можете использовать const_cast
, чтобы попросить компилятор переопределить это, но это опасно. Если это не так, отметьте его const
, чтобы его можно было вызывать и для const
объектов:
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}