Учёба. Классы. Нужна помощь. - страница 23

 
Похоже, структуры не очень в почете - нет ни указателей, ни виртуальности.
 

Почему в этом исходнике реализация каких-то методов внутри объявления класса, а каких-то - снаружи?

Список методов всегда можно получить через ALT+M. В чем удобство делать что-либо снаружи?

 
Alexey Viktorov #:

По возрастанию чего? Времени, цены или по имени инструмента?

Вот и я про то, что объекты - это сложные структуры данных, правила работы с ними определяет разработчик.
 
Vladislav Boyko #:

Сравните экземпляр CFrameData с экземпляром InvalidClass:

Что произойдет? Логи будут? Или упадет раньше, чем должно выполниться логирование?

Я не знаю ответ на свои вопросы, мне просто интересно.

Если вы уверены, что не произойдет сравнения разных производных классов, то да, в таком случае пофигу. Можно просто кастовать указатель без проверки и спокойно сравнивать.

Зависит от проекта и от разработчика/разработчиков.

В дебаг-версии - выскочит ASSERT, и выполнение программы приостановится. 

В релиз-версии - скорее всего, произойдёт краш. Но, в релиз-версии сравнение неродственных объектов не должно появляться. Мне сложно придумать ситуацию, когда бы в подобных преобразованиях появление неродственных объектов не было бы ошибкой. А раз это ошибка - то она должна выявляться ещё на стадии DEBUG-версии. 

 
Georgiy Merts #:

В дебаг-версии - выскочит ASSERT, и выполнение программы приостановится. 

В релиз-версии - скорее всего, произойдёт краш. Но, в релиз-версии сравнение неродственных объектов не должно появляться. Мне сложно придумать ситуацию, когда бы в подобных преобразованиях появление неродственных объектов не было бы ошибкой. А раз это ошибка - то она должна выявляться ещё на стадии DEBUG-версии. 

Понял, спасибо. Как я уже говорил, мне просто любопытно было

 
Sergey Gridnev #:
Допустим, ваш объект содержит цену, время, объём и имя инструмента. Как коллекцию этих объектов отсортировать по возрастанию?

Выше я давал пример такого сравнения. 

В переменной mode - передаём признак сортировки. То есть, перечисление из восьми значений - по два (возрастание и убывание) для каждого поля. 

Внутри функции Compare - смотрим, какой режим передаётся, и в зависимости от режима - сравниваем соответствующие поля текущего объекта, и переданного через Compare. Возвращаем 1,-1 или 0 - в зависимости от результата сравнения. 

 
Vladislav Boyko #:

Смотрите производные от CArray. ArrayObj.mqh, например - там в QuickSort() используется Compare()

Вот теперь разобрался. Спасибо.

В Array.mqh есть виртуальная функция QuickSort() и в ArrayObj.mqh тоже, но не виртуальная. Она и выполняется в сортировке.

Но вот по Alt+g переход происходит в виртуальную функцию из Array.mqh, потому я и не мог сразу найти…

 
Alexey Viktorov #:

...Вот не могу понять как из сортировки вызывается Compare() где это обращение к этому методу? Я уже показал, из метода поиска чётко видно… А из метода сортировки, ну никак не вижу...

virtual void      QuickSort(int beg,int end,const int mode=0) { m_sort_mode=-1; }

Разработчик сделал метод CArray::QuickSort() виртуальным, намекая на то, что мы можем его дальше переопределить в наследниках. Ну и ещё любезно указал, что класс CArray точно не занимается сортировкой (m_sort_mode=-1;). Так что сортировка делегируется наследникам...

 
fxsaber #:

Почему в этом исходнике реализация каких-то методов внутри объявления класса, а каких-то - снаружи?

Список методов всегда можно получить через ALT+M. В чем удобство делать что-либо снаружи?

Дело вкуса. Как по мне, то что-то короткое делается внутри, что-то большое снаружи. 

 
Denis Kirichenko #:

Разработчик сделал метод CArray::QuickSort() виртуальным, намекая на то, что мы можем его дальше переопределить в наследниках. Ну и ещё любезно указал, что класс CArray точно не занимается сортировкой (m_sort_mode=-1;). Так что сортировка делегируется наследникам...

Я разобрался на минуту раньше… Спасибо. Именно так и есть в наследнике ArrayObj.mqh этот метод переопределён и там есть обращение к Compare()