Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Учёба. Классы. Нужна помощь.
Denis Kirichenko, 2024.12.17 13:42
Почему в этом исходнике реализация каких-то методов внутри объявления класса, а каких-то - снаружи?
Список методов всегда можно получить через ALT+M. В чем удобство делать что-либо снаружи?
По возрастанию чего? Времени, цены или по имени инструмента?
Сравните экземпляр CFrameData с экземпляром InvalidClass:
Что произойдет? Логи будут? Или упадет раньше, чем должно выполниться логирование?
Я не знаю ответ на свои вопросы, мне просто интересно.
Если вы уверены, что не произойдет сравнения разных производных классов, то да, в таком случае пофигу. Можно просто кастовать указатель без проверки и спокойно сравнивать.
Зависит от проекта и от разработчика/разработчиков.
В дебаг-версии - выскочит ASSERT, и выполнение программы приостановится.
В релиз-версии - скорее всего, произойдёт краш. Но, в релиз-версии сравнение неродственных объектов не должно появляться. Мне сложно придумать ситуацию, когда бы в подобных преобразованиях появление неродственных объектов не было бы ошибкой. А раз это ошибка - то она должна выявляться ещё на стадии DEBUG-версии.
В дебаг-версии - выскочит ASSERT, и выполнение программы приостановится.
В релиз-версии - скорее всего, произойдёт краш. Но, в релиз-версии сравнение неродственных объектов не должно появляться. Мне сложно придумать ситуацию, когда бы в подобных преобразованиях появление неродственных объектов не было бы ошибкой. А раз это ошибка - то она должна выявляться ещё на стадии DEBUG-версии.
Понял, спасибо. Как я уже говорил, мне просто любопытно было
Допустим, ваш объект содержит цену, время, объём и имя инструмента. Как коллекцию этих объектов отсортировать по возрастанию?
Выше я давал пример такого сравнения.
В переменной mode - передаём признак сортировки. То есть, перечисление из восьми значений - по два (возрастание и убывание) для каждого поля.
Внутри функции Compare - смотрим, какой режим передаётся, и в зависимости от режима - сравниваем соответствующие поля текущего объекта, и переданного через Compare. Возвращаем 1,-1 или 0 - в зависимости от результата сравнения.
Смотрите производные от CArray. ArrayObj.mqh, например - там в QuickSort() используется Compare()
Вот теперь разобрался. Спасибо.
В Array.mqh есть виртуальная функция QuickSort() и в ArrayObj.mqh тоже, но не виртуальная. Она и выполняется в сортировке.
Но вот по Alt+g переход происходит в виртуальную функцию из Array.mqh, потому я и не мог сразу найти…
...Вот не могу понять как из сортировки вызывается Compare() где это обращение к этому методу? Я уже показал, из метода поиска чётко видно… А из метода сортировки, ну никак не вижу...
Разработчик сделал метод CArray::QuickSort() виртуальным, намекая на то, что мы можем его дальше переопределить в наследниках. Ну и ещё любезно указал, что класс CArray точно не занимается сортировкой (m_sort_mode=-1;). Так что сортировка делегируется наследникам...
Почему в этом исходнике реализация каких-то методов внутри объявления класса, а каких-то - снаружи?
Список методов всегда можно получить через ALT+M. В чем удобство делать что-либо снаружи?
Дело вкуса. Как по мне, то что-то короткое делается внутри, что-то большое снаружи.
Разработчик сделал метод CArray::QuickSort() виртуальным, намекая на то, что мы можем его дальше переопределить в наследниках. Ну и ещё любезно указал, что класс CArray точно не занимается сортировкой (m_sort_mode=-1;). Так что сортировка делегируется наследникам...
Я разобрался на минуту раньше… Спасибо. Именно так и есть в наследнике ArrayObj.mqh этот метод переопределён и там есть обращение к Compare()