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

 
Vitaly Murlenko #:

Не догадался, да? Тебе приходилось программировать в среде Bornald Delphi, или  Bornald С++? Виртуальная функция нужна для того, чтоб иметь возможность плодить наследников. Посмотри, вот я для тебя специально сделал скриншот:

Я кидаю на форму кнопку и ей автоматически присваивается имя Button1, ещё кнопку и у неё имя  Button2, и так далее. Все эти  Button1 -  Button4 - это наследники виртуальной  Button. Если бы не существовала виртуальная кнопка, ты не смог бы создавать кнопки-наследники.

Найди пожалуйста в классе class CObject виртуальную функцию 

   virtual int       Compare(const CObject *node,const int mode=0) const { return(0);      }

и объясни пожалуйста как это работает. Куда какие наследники надо писать? Что означает указатель(если я правильно понимаю) *node 

Что означает mode я примерно понимаю. Но только примерно…

 
Vitaly Murlenko #:

Не догадался, да? Тебе приходилось программировать в среде Bornald Delphi, или  Bornald С++? Виртуальная функция нужна для того, чтоб иметь возможность плодить наследников. Посмотри, вот я для тебя специально сделал скриншот:

Я кидаю на форму кнопку и ей автоматически присваивается имя Button1, ещё кнопку и у неё имя  Button2, и так далее. Все эти  Button1 -  Button4 - это наследники виртуальной  Button. Если бы не существовала виртуальная кнопка, ты не смог бы создавать кнопки-наследники.

никогда больше не пиши мне.

 
Добрые вы, однако. Эмоции - аж через край. Разбирайтесь сами, раз такие.
 
Vitaly Murlenko #:
Добрые вы, однако. Эмоции - аж через край. Разбирайтесь сами, раз такие.

бывает иногда

 
Alexey Viktorov #:

Найди пожалуйста в классе class CObject виртуальную функцию 

и объясни пожалуйста как это работает. Куда какие наследники надо писать? Что означает указатель(если я правильно понимаю) *node 

Что означает mode я примерно понимаю. Но только примерно…

https://www.mql5.com/ru/docs/standardlibrary/cobject - лучше разработчика я отвечу вряд ли. Наследники уже написаны. Использование символа звёздочки нужно для работы с памятью. Что такое mode - не знаю, но могу предположить, что это как-то связано с созданием нового экземпляра.

P.S.

Классы наследники (судя по справке) написаны разработчиком. Задайте лучше эти вопросы ему .

Документация по MQL5: Стандартная библиотека / Базовый класс CObject
Документация по MQL5: Стандартная библиотека / Базовый класс CObject
  • www.mql5.com
Класс CObject является базовым классом для построения стандартной библиотеки MQL5. Класс CObject обеспечивает всем своим потомкам возможность быть...
 
lynxntech #:

никогда больше не пиши мне.

Я не ставлю ни кого в игнор. Но просьбу выполню. Сам попросил.

 
Vitaly Murlenko #:
https://www.mql5.com/ru/docs/standardlibrary/cobject - лучше разработчика я отвечу вряд ли. Наследники уже написаны.

В документации эти моменты никак не проясняются.
 
Vitaly Murlenko #:

... Виртуальная функция нужна для того, чтоб иметь возможность плодить наследников.

Я кидаю на форму кнопку и ей автоматически присваивается имя Button1, ещё кнопку и у неё имя  Button2, и так далее. Все эти  Button1 -  Button4 - это наследники виртуальной  Button. Если бы не существовала виртуальная кнопка, ты не смог бы создавать кнопки-наследники.

Виталий, я, конечно, извиняюсь, но то, что вы написали, не имеет ничего общего с механизмом виртуальных функций. Кнопки на форме не являются разными наследниками. Если будет время, напишу подробнее позже.
 
Yuriy Bykov #:
Виталий, я, конечно, извиняюсь, но то, что вы написали, не имеет ничего общего с механизмом виртуальных функций. Кнопки на форме не являются разными наследниками. Если будет время, напишу подробнее позже.

лучше бы сейчас популярно объяснили, в классах ничего сложного нет, но виртуальные функции

 
Alexey Viktorov #:

Найди пожалуйста в классе class CObject виртуальную функцию 

и объясни пожалуйста как это работает. Куда какие наследники надо писать? Что означает указатель(если я правильно понимаю) *node 

Что означает mode я примерно понимаю. Но только примерно…

Да это отличная штука! 

У меня на этой самой виртуальной функции построены, по сути дела, все списки - сделок, открытых позиций, фреймов... да чего угодно!

Класс CObject - по мне - очень удобный. Это класс объектов, которые можно объединять в массивы-списки с возможностью сортировки. 

При сортировке ничего не надо придумывать. Написал функцию сравнения (реализовал вот этот самый виртуальный метод Compare) - и вуаля - у тебя есть возможность любых сортировок. 

Смотри, тебе надо пронаследоваться от CObject и переопределить функцию:

   virtual int       Compare(const CObject *node,const int mode=0)

В эту функцию передаётся указатель на другой такой же объект. Он передан в виде CObject*, но реально является указателем на другой твой такой же созданный объект. Внутри функции ты преобразуешь указатель, и имеешь возможность работать с ним. (Рекомендуется после преобразования типов проверить валидность переданного объекта). 

И далее - ты имеешь "себя" (объект, в котором вызвана функция Compare()) и указатель на другой объект, с которым надо сравнить. Причем, тебе также передан режим сравнения, который можно использовать.

В функции смотришь на "себя", и на переданный объект, выясняешь, кто из них больше, и возвращаешь -1,0 или 1- в зависимости от результата. Как раз тут и можешь использовать и режим сравнения, чтобы сравнивать по разным критериям.

А дальше - создаёшь кучу таких объектов, заполняешь ими CArrayObj, и когда надо - вызываешь у этого массива функцию сортировки. В эту функцию также ты передаёшь режим сравнения. И класс CArrayObj - проведёт быструю сортировку с указанным режимом (используя функции сравнения). 

По мне - отлично всё придумано!

Вот, для иллюстрации прикрепляю свой класс CFrameData - это объект фрейма, который используется для работы с результатами оптимизации. Как раз он пронаследован от CObject (CMyObject - это тот же  CObject  с небольшими добавлениями). Погляди, как там организованная функция Comparе! (Там много других функций и ссылок на другие файлы, но эта - достаточно ясно написана, и для неё всё должно быть понятно.)

Файлы:
FrameData.mq5  37 kb
FrameData.mqh  11 kb