Как переопределить Compare() в CObject, чтобы CList sort() работал? - страница 4

 
Ex Ovo Omnia:

Мне просто интересно, зачем вам понадобился оператор "&" вфункции Compare(), чтобы получить значение "this".


Потому что метод Compare() является "const", и внутри него нельзя вызывать не "const" методы.

В данном примере, см. код на странице 2, метод getPrice() не является const и внутри него функция CopyClose() также не является const. Все методы могут быть приведены к "const", но CopyClose() - нет.

В любом случае, оператор "&" дает доступ к методам не const, поэтому мы можем вызывать их внутриметода "const".

 
Gustavo Hennemann:

Потому что метод Compare() является "const", и внутри него невозможно вызвать методы, не являющиеся "const".

В данном примере, см. код на странице 2, метод getPrice() не является const и внутри него функция CopyClose() также не является const. Все методы можно перевести в "const", а CopyClose() - нет.

В любом случае, оператор "&" дает доступ к методам не const, поэтому мы можем вызывать их внутриметода "const".


Теперь я понял. Я понятия не имею, является ли это правильной конструкцией, возможно, вы знаете. По мне, так в MQL лучше полностью избегать объявления методов 'const', как в Java.

 
Ex Ovo Omnia:

Теперь я понял. Я понятия не имею, является ли это валидной конструкцией, возможно, вы знаете. На мой взгляд, в MQL лучше полностью избегать объявления методов 'const', как в Java.


Для того, чтобы использовать (очень полезные) методы классов коллекций библиотеки std (т.е. поиск, сортировка и т.д.), вы должны переопределить метод Compare объекта CObject. Это означает, что все методы, вызываемые из метода Compare, также должны быть методами const. ОП не обошел эту деталь, он просто неправильно использовал указатель'this'. Поэтому вместо того, чтобы просто вызвать this.DoSomething(), ОП создал свой собственный указатель на (self)объект. например, otherSelfPointer.DoSomething()

 
nicholishen:

Чтобы использовать (очень полезные) методы классов коллекций библиотеки std (т.е. поиск, сортировка и т.д.), необходимо переопределить метод Compare объекта CObject. Это означает, что все методы, вызываемые из метода Compare, также должны быть методами const. ОП не обошел эту деталь, он просто неправильно использовал указатель this. Поэтому вместо вызова this.DoSomething(), ОП создал свой собственный указатель на (self)объект вместо того, чтобы просто использовать ключевое слово this. например, otherSelfPointer.DoSomething().


Я понимаю, что он сделал, вопрос в том, является ли эта конструкция безвредной (в общем случае). Компилятор не ожидает, что объект изменяет свои члены в const-функциях.

 
Ex Ovo Omnia:

Я понимаю, что он сделал, вопрос теперь в том, является ли эта конструкция безвредной (в общем случае). Компилятор не ожидает, что объект изменяет свои члены в const-функциях.

В данном конкретном случае я только получаю значение, я ничего не меняю. Но, если мы попытаемся изменить const-значение, вероятно, компилятор предупредит об этом, или, в худшем случае, мы получим исключение времени выполнения.

 
Ex Ovo Omnia:

Я понимаю, что он сделал, вопрос теперь в том, является ли эта конструкция безвредной (в общем случае). Компилятор не ожидает, что объект модифицирует свои члены в const-функциях.


Ohhh.... Теперь я понял, виноват. Это потенциально может быть опасно. OP должен убедиться, что все методы в пределах видимости Compare() также являются const-методами.

 
Gustavo Hennemann:

Здравствуйте @Alain Verleyen,

Я изменил метод getPrice(), вместо использования CopyClose() я использую CopyBuffer(). Это не меняет основной задачи.

Итак, если я использую ключевое слово "const" в методе getPrice(), то получаю ошибку: "'CopyBuffer' - ни одна из перегрузок не может быть применена к вызову функции". Я думаю, это происходит потому, что CopyBuffer не является const-методом, и невозможно вызвать не const-метод внутри const-метода.

Извините за поздний ответ, но у меня не было времени следить за темой до сих пор.

Я все еще не понимаю, почему вы не могли объявить getPrice() как const при использовании CopyBuffer(). Это не имеет смысла для меня, не могли бы вы опубликовать вашу обновленную версию getPrice()?

 

Любые обновления