Реализация для Android немного отличается, так как вам нужно использовать findNodeHandle и сделать ссылку на размытые компоненты. Вот пример кода, который мне подходит:
https://gist.github.com/harixth/d9414a63a859b2e19b13d9915fcaa00c
Проблема звонит не - const
функция test2.test()
на const
объект test2
от testing::test1
.
testing::test1
добирается test2
в качестве параметра const testing &test2
. Таким образом в [1 111], test2const
. Затем в первой строке функции:
test2.test()
Эти testing::test
функция вызвана на [1 114]. Та функция не объявляется с [1 115] в конце подписи, таким образом, это может изменить объект, к этому обращаются (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
не был объявлен с [1 122], и таким образом несоответствие обнаруживается при попытке сделать не - const
, указатель (this
) относится к const
объект (testing
), игнорируя const
спецификатор .
Для решения этого решите, ли эти testing::test
функция должна когда-либо должна быть изменить объект, к этому обращаются (способ, которым это записано теперь, это не делает как все, что это делает return 1
, однако который может измениться, таким образом, необходимо думать в том, что его намеченная функциональность). Если это должно, то, очевидно, называя его на const
объект плох, хотя можно использовать const_cast
, чтобы попросить, чтобы компилятор переопределил это, но это опасно. Если это не должно, затем отметить его const
, так, чтобы это можно было назвать на [1 133] объекты также:
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}
Из-за определения функции членства test1:
int testing::test1(const testing& test2){
test2.test();
return 1;
}
Вы являетесь передающими в ссылке константы для переменной test2.
, Который означает, что Вы не можете изменить члена test2 и Вы не можете назвать функцию членства, которая не является константой или не статична.
Вот то, как можно зафиксировать:
int testing::test() const {
return 1;
}
дополнительная константа в конце говорит компилятору, что Вы не планирование изменения содержания текущего объекта (и если Вы сделаете то Вы получите другую ошибку компиляции).
Строка: test2.test ()
вызывает не функцию константы, даже при том, что test2 является ссылкой константы. Это - проблема. Можно зафиксировать это путем создания тестирования:: протестируйте функцию константы.
тестирование:: test1 (константа testing& test2), ожидает переданный объект быть константой, и это даст Вам ошибку или при изменении значений, он - переменные, или получают доступ любые методы этого, которые явно не определяются как константа
Начиная с теста (), метод на самом деле не изменяет данных, лучшая практика должна установить его константа, следующим образом:
class testing{
int test() const;
int test1(const testing& test2);
};
int testing::test() const {
return 1;
}
, С другой стороны, просто удаляют константу слова при определении аргументов в пользу test1 (), и это позволит Вам получать доступ к любому из методов переданного объекта на Вашем досуге.